2016-10-19 27 views
5

Poniższy kod ulega awarii w Swift 3, czy ktoś może wyjaśnić dlaczego?swift 3 tablica struktur -> rzut do NSObject -> odrzucenie => awaria

struct S { 
    let a:Int 
} 

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

Czy to dlatego, że w Swift 3 tablica kodowanym jest NSObject (nie ma go w Swift 2) i jakoś nie mogą być konwertowane do NSArray dobrze? I dlaczego jest NSObject ..

+0

Czy 'letz: AnyObject = t jako NSObject' nawet kompiluje się dla Ciebie ...? Tablice w swift są typami wartości i naturalnie nie pochodzą z konkretnej klasy typu 'NSObject'. W Swift 2 niejawne mostkowanie rodzimych typów Swif i typów Obj-C może pozwolić na nieco mylące konwersje, ale domyślne funkcje pomostowe zostały usunięte w Swift 3. – dfri

+0

To dziwne, skoro 'let v = u as? [S] 'działa. – JAL

+0

@dfri - tak, kompiluje, może to być błąd w Swift 3 .. – silyevsk

Odpowiedz

2

Możliwym rozwiązaniem byłoby wykorzystanie warunkowego wiązania z opcjonalnym spuszczonymi:

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

Nie wiem, dlaczego wymuszonym przygnębiony nie będzie działać chociaż. Może być coś ciekawego z NSObject.