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
배열 요소의 유형을 알 수 없습니다. it 's T. Simpler :'if T.self == Int.self' – matt
또한 첫번째 줄에는'Optional>'을 쓰지 않습니다. –
matt
일반은 붉은 청어입니다! '[Int]()는 [String]'은'true'입니다. – matt