2016-10-19 17 views
5

Aşağıdaki kod, Swift 3'te çöküyor, herkes nedenini açıklayabilir mi? swift 3 dizi yapı -> Cast to NSObject -> cast back => çökme

struct S { 
    let a:Int 
} 

let t = [S(a: 8)] 
let u:AnyObject = t as NSObject 
let v:[S] = u as! [S] 

çünkü Swift içinde yapılar 3 dizi NSObject (o Swift 2'de değil) ve bu şekilde de NSArray dönüştürülebilir edilemez mi? Ve neden öyle NSObject ..

+0

Izinle: AnyObject = t NSObject olarak bile sizin için derler ...? Hızlı diziler, değer türleridir ve doğal olarak “NSObject” tipi beton sınıfından türetilmez. Swift yerel türleri ve Obj-C türleri arasında Swift 2 örtüşen köprüleme, biraz kafa karıştırıcı dönüşümlere izin verebilir, ancak Swift 3'te örtülü köprüleme olanakları kaldırılmıştır. – dfri

+0

Bu gariptir, çünkü v = u olarak mı? [S] 'çalışır. – JAL

+0

@dfri - evet, bu derleme, Swift 3'te bir hata olabilir .. – silyevsk

cevap

2

Muhtemel bir çözüm opsiyonel downCast ile koşullu bağlayıcı kullanmak olacaktır:?

if let v = u as? [S] { /* */ } 

zorla mahzun olsa işe yaramaz neden emin. NSObject ile devam eden bir şey olabilir.