Chạy qua một lỗi thú vị trước đó ngày hôm nay khi làm việc với Generics trong Swift. Tôi đã tìm ra một giải pháp, nhưng tôi tự hỏi nếu có ai có thể trả lời tại sao trình biên dịch không bắt được một cái gì đó như thế này. Hãy để tôi bắt đầu với một khối mã.Có gì với mảng trống và generics trong 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)
Xem dòng 4. Tại sao heck là true
? Tui bỏ lỡ điều gì vậy? Không nên trình biên dịch đủ thông minh để tìm ra đây không phải là một mảng của String
s? Điều này cuối cùng dẫn đến một lỗi trong đó một giá trị được đặt không chính xác do mảng trống được giả định là sai loại.
Theo như một giải pháp, tôi đã đi với một cái gì đó dọc theo dòng:
if type(of: array).Element.self == Model.self
Bạn _know_ loại phần tử của mảng; đó là T. Đơn giản: 'nếu T.self == Int.self' – matt
Ngoài ra tôi không nhận được' Tùy chọn> 'cho dòng đầu tiên. –
matt
Loại chung là cá trích đỏ! '[Int]() là [String]' là 'true'. – matt