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
あなたは配列の要素の型を知りません。それはTです。Simpler: 'if T.self == Int.self' – matt
また、最初の行に' Optional> 'が付きません。 –
matt
ジェネリックは赤いニシンです! '[Int]()は[String]'が 'true'です。 – matt