2017-12-24 2 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

あなたは配列の要素の型を知りません。それは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

関連する問題