2017-12-24 197 views
5

Swift'de jeneriklerle çalışırken, bugün erken saatlerde ilginç bir hatayla karşılaştı. Bir çözüm buldum, ama merak ediyorum, derleyicinin neden böyle bir şey yakalamadığını kimse cevaplayabilir mi? Bir kod bloğuyla başlayayım.Swift'deki boş diziler ve jenerikler hakkında neler var?

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) 

Hat 4'e bakın. Neden heck true? Bir şey mi eksik? Derleyicinin bunu anlamaya yetecek kadar akıllı olmaması, String s dizisi değil midir? Bu sonuçta, yanlış türden olduğu varsayılan boş diziden dolayı bir değerin yanlış ayarlandığı bir hataya yol açtı. Aslında jenerik ile ilgisi yoktur

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

Dizinin öğelerinin türünü _know_; T. Simpler: 'T. Kendin == Int.self' – matt

+1

Ayrıca, ilk satır için' İsteğe bağlı > 'seçeneğini alamıyorum. – matt

+1

Genel bir kırmızı ringa balığı! [Int]() [String] '' true'dur. – matt

cevap

6

:

Bildiğim kadarıyla bir çözüm olarak, ben çizgisinde bir şey ile gitti. tipi bir dizi olup olmadığını Herhangi boş dizi true ile is soruya cevap verir:

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

Garip görünüyor; file a bug.