2017-12-24 7 views
5

스위프트 (Swift)에서 제네릭을 사용하여 흥미로운 버그를 발견했습니다. 나는 해결책을 알아 냈다. 그러나 누군가가 컴파일러가 왜 이와 같은 것을 잡아 내지 못하는지에 대한 대답을 할 수 있는지 궁금하다. 먼저 코드 블록부터 시작하겠습니다.Swift에서 빈 배열 및 제네릭은 무엇입니까?

func doSomething<T>(with array: [T]) { 
    type(of: array)  // Optional<Array<Int>> 
    array is [Int]  // true 
    array is [String] // true 
} 

var arrayOfInts: [Int] = [] 
doSomething(with: arrayOfInts) 

4 번 줄을 참조하십시오. 왜 true입니까? 내가 놓친 게 있니? 컴파일러가 String 배열이 아니라는 것을 알기에 충분히 똑똑해야하지 않습니까? 이것은 궁극적으로 잘못된 유형으로 가정 된 빈 배열로 인해 값이 잘못 설정된 버그를 야기했습니다. 실제로는 일반과 아무 상관이

if type(of: array).Element.self == Model.self 
+0

배열 요소의 유형을 알 수 없습니다. it 's T. Simpler :'if T.self == Int.self' – matt

+1

또한 첫번째 줄에는'Optional >'을 쓰지 않습니다. – matt

+1

일반은 붉은 청어입니다! '[Int]()는 [String]'은'true'입니다. – matt

답변

6

:

는 지금까지 솔루션으로, 나는의 라인을 따라 뭔가 갔다. 유형이 배열 인 경우 모든 하늘의 배열 trueis 질문에 대한 답 :

[Int]() is [String] // true 
[1] is [String] // false 

것은 그것은 이상한 보인다; file a bug.