Ответ 1
В объявлении типа !
похож на ?
. Оба являются необязательными, но !
является " неявно разворачивается" необязательно", что означает, что вам не нужно разворачивать его для доступа к значению (но он все равно может быть равен нулю).
В основном это поведение, которое мы уже имели в objective-c. Значение может быть нулевым, и вы должны проверить его, но вы также можете просто получить доступ к значению напрямую, как если бы он не был необязательным (с той важной разницей, что если вы не проверите ничто, вы получите ошибка времени выполнения)
// Cannot be nil
var x: Int = 1
// The type here is not "Int", it "Optional Int"
var y: Int? = 2
// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3
Использование:
// you can add x and z
x + z == 4
// ...but not x and y, because y needs to be unwrapped
x + y // error
// to add x and y you need to do:
x + y!
// but you *should* do this:
if let y_val = y {
x + y_val
}