2017-12-24 124 views
5

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 
+0

Bạn _know_ loại phần tử của mảng; đó là T. Đơn giản: 'nếu T.self == Int.self' – matt

+1

Ngoài ra tôi không nhận được' Tùy chọn > 'cho dòng đầu tiên. – matt

+1

Loại chung là cá trích đỏ! '[Int]() là [String]' là 'true'. – matt

Trả lời

6

Trên thực tế nó không có gì để làm với các generic. Bất kỳ mảng trống trả lời câu hỏi is với true nếu loại là một mảng:

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

Nó có vẻ kỳ quặc; file a bug.

Các vấn đề liên quan