Имя !
всегда меня смущает: оно называется "неявно разворачивается необязательно". Однако что подразумевается в этом? Неявные средства "подразумеваются, хотя и не ясно выражены". Однако, не добавляет ли !
прямо выражать свою цель? Не добавляет ли !
сделать это явным, что мы пытаемся выполнить?
Почему? в Свифте называется "неявно", а не "явно" разворачивается необязательно?
Ответ 1
В Swift конечные восклицательные знаки (!
) используются двумя разными способами. Один из них называется принудительная развязка. Это когда у вас есть переменная, определенная как опция, и вы хотите в основном утверждать, что это значение не равно нулю, чтобы вы могли использовать его, как если бы он не был необязательным:
var optionalName: String? = "World"
if optionalName != nil {
sayHelloTo(optionalString!)
}
Альтернативный способ, которым вы могли бы описать "принудительная развязка", - "Явная разворачивание", но принудительно добавляет дополнительный намек на то, что вся программа выйдет из строя, если вы попытаетесь "принудительно развязать" необязательный, который равен нулю.
Во-вторых, вы фактически объявляете тип переменной и называетесь Неявно Unwrapped Optional. Это необходимо, если вы хотите объявить переменную, которая является технически необязательной, но вы будете рассматривать ее как необязательную. Каждый раз, когда вы используете этот Неявно Unwrapped Необязательный, это на самом деле, делая описанную выше "Force Unwrapping":
var name: String! = "World"
if name != nil {
sayHelloTo(name)
}
Вы по-прежнему можете тестировать Необязательно Unwrapped Optional для nil, но вы также можете использовать его напрямую, как если бы он не был необязательным. Поэтому считается неявным. Каждый раз, когда вы его используете, он автоматически, неявно развернут для вас.
Как "принудительная развязка", "неявно развязанный необязательный" по-прежнему будет разбивать всю программу, если вы попытаетесь использовать ее, когда она равна nil
Ответ 2
Обычный Дополнительный
var foo : Foo? = Foo()
foo!.doSomething() // explicitly unwrap it and call the method
Неявно Unwrapped Необязательный
var foo : Foo! = Foo()
foo.doSomething() // implicitly unwrap it and call the method just like it is not optional
В обоих случаях вам нужно что-то объявить необязательным (?
или !
). Неявно Unwrapped Необязательно не добавляет больше. Но вы можете опустить оператор разворота при его использовании.