Быстрые переменные украшения с надписью "?" (вопросительный знак) и "!" (восклицательный знак)

Я понимаю, что в Swift все переменные должны быть заданы со значением, а с помощью опций мы можем сначала установить переменную, которая будет установлена ​​на nil.

Я не понимаю, что делает настройка переменной с помощью !, потому что у меня создалось впечатление, что это "разворачивает" значение из необязательного. Я думал, что, сделав это, вы гарантируете, что есть значение для разворота в этой переменной, поэтому на IBActions и, как вы понимаете, используется.

Итак, просто введите, что инициализируется переменной, когда вы делаете что-то вроде этого:

var aShape : CAShapeLayer!

И почему/когда я это сделаю?

Ответ 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
}