2015-12-23 2 views
0

Я уверен, что это может быть дубликат, но я не могу найти никаких подробных и компактных объяснений, так что вот оно.Об объявлении опциональных и необязательных в Swift

Мы все знаем, что, если мы объявляем переменную, как этот

1> var a : String? 

мы получаем дополнительный

a: String? = nil 

и если мы опустим ? мы должны инициализировать a к чему-то другому, чем nil во время создания. Однако, если мы говорим, что-то вроде

2> var a : String! 

мы получаем

a: String! = nil 

который путает меня не конца, потому что я был в предположении, что это заявление означает, что a не может быть необязательным. Так, играя с РЕПЛ, я получаю следующие результаты: bemusing

3> a! 
fatal error: unexpectedly found nil while unwrapping an Optional value 

4> a as! String 
fatal error: unexpectedly found nil while unwrapping an Optional value 

5> a as! String? 
$R2: String? = nil 

6> a as? String 
fatal error: unexpectedly found nil while unwrapping an Optional value 

7> a as? String! 
$R3: String!? = nil 

Может кто-то обеспечить некоторый свет в это?

+3

Пожалуйста, прочитайте раздел о 'неявной развернутого цикла Optionals' в руководстве Swift Язык: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309 – vadian

ответ

3

var a: String! - это то, что мы называем неявным образом развернутым дополнительным. Это необязательный параметр, который может содержать значение nil, но компилятор не производит ошибок времени компиляции.

Если у него было значение nil и оно было использовано, вы получите ошибку времени выполнения, как если бы вы принудительно развернули обычный дополнительный параметр, который имеет значение nil.

Косвенно развернутые OPTIONALS полезны, когда значение необязательным является подтверждается немедленно после того, существует дополнительный сначала определена и определенно можно предположить существование в каждой точке после этого.

+0

Итак, это полезно, скажем, для переменных свойств класса или структуры, которые, как я знаю, я собираюсь инициализировать в какой-то момент **, прежде чем ** использовать их, правильно? Но тогда почему я позволил потом установить их на «nil»? Это, несомненно, нарушит предположение, что они «существуют в каждой точке после». Я ожидал, что время выполнения не позволит мне это сделать. – Morpheu5

+1

Я не уверен, почему такого ограничения не существует. Вы можете только надеяться, что каждый человек, с которым вы работаете, знает, как справиться с ними, и что они не нарушат традицию. – hannad

+1

Однако, если такая вещь для вас беспокоит, самым безопасным способом является использование обычного необязательного в сочетании с оператором 'if let', чтобы безопасно его разворачивать. – hannad

Смежные вопросы