Там, как представляется, несогласованность между предполагаемыми и динамическими типами значений в следующем коде (за пределами ожидаемого общности на неподвижной стороне):Прогнозные, статические и динамические типы вложенных опциями и их массивы в Swift
// playground values in Xcode 7.0.1 (7A1001)
// (same behaviour in a release build)
let oi: Int? = nil // nil
let ooi: Int?? = nil // nil
let os = [oi, ooi] // [{nil}, nil]
let anys: [Any] = [oi, ooi] // [nil, nil]
oi == nil // true
ooi == nil // true
os[0] == nil // false
os[1] == nil // true
os[0].dynamicType // Optional<Optional<Int>>.Type
os[1].dynamicType // Optional<Optional<Int>>.Type
anys[0].dynamicType // Optional<Int>.Type
anys[1].dynamicType // Optional<Optional<Int>>.Type
(os[0] as Any).dynamicType // Optional<Optional<Int>>.Type
(os[1] as Any).dynamicType // Optional<Optional<Int>>.Type
os[0]! // nil
os[1]! // fatal error: unexpectedly found nil while unwrapping an Optional value
Например, не следует ли ожидать возврата Optional<Int>.Type
?
Спасибо за ответ. Увы, я не совсем уверен, что сделано «более ясно» в вашем примере кода. Обратите внимание, что вложенные опциональные элементы имеют совпадение по образцу (например, переключение на 'ooi' типа' Int ?? 'будет печатать' None' этим же кодом). Так что, если 'os [0]' соответствует шаблону как 'Int? 'Или' Int ??', поведение не должно наблюдаться ... – milos