[Int]は[Int?]のサブタイプではないので、コンパイラのバグです。コードはエラーなしでコンパイルするべきではありません。しかし、次のコードは期待どおりに動作するはずです
let i: [Int?] = [1,2,3]
let d: [Double?] = [1,2,3]
func foo<T>(arr:[T?]?) -> [T] {
guard let barr = arr where T.self == Int.self else { return [] }
return barr.flatMap{ $0 }
}
print(foo(i), foo(i).dynamicType)
print(foo(d), foo(d).dynamicType)
/*
[1, 2, 3] Array<Int>
[] Array<Double>
*/
バグ報告を記入してください!さらに興味深いことに、次のコードは、
let j = [Optional(1),Optional(2)] as? [Int]
しかし
let j = [Optional(1),Optional(2)]
let k = j as? [Int]
コンパイルとクラッシュ...
let arr0:[Int?]? = [1,2,3]
if let r = arr0 where r.dynamicType == [Int].self {
print(r, r.dynamicType)
} else {
print("not [Int]")
}
// prints
// not [Int]
// but
func foo()->[Int] {
let arr0:[Int?]? = [1,2,3]
if let r = arr0 where r.dynamicType == [Int].self {
print(r, r.dynamicType)
// !!!!! ERROR !!!!!
// next line doesn't compile wihout flatMap !!!!
//
// error: cannot convert return expression of type '[Int?]' to return type '[Int]'
//
// even though that it is clear from the where clause that r type must be [Int]
return r.flatMap{ $0 }
} else {
print("arr0 is not [Int]")
return []
}
}
foo() // [] and prints: arr0 is not [Int]
は私がなぜこのクラッシュの質問が回答されているかを確認していないがコンパイルされません。すでにリンクされたスレッドによって。このランタイムクラッシュのさらに小さな例は '[Int?](count:2、repeatedValue:1)は[Int]'です。これは私が奇妙であると信じています。リンクされたスレッドでは、OPは強制アンラッピング( '...!')と強制キャスティング( ''! ')を使用しようとしますが、ここでは ''型表現のチェックを使用するだけで問題を再現できます。私は間違っているかもしれませんが、私の心配するところでは、これはバックエンドの砂糖(ビットキャストの魔法)に起因するバグのような動作のようです。 – dfri
@dfri、本当の答えよりも唯一のメモがあるにもかかわらず、私の '答え'をチェックしてください。 – user3441734