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


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

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

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

var aShape : CAShapeLayer!

и почему / когда я должен это сделать?

1 92

1 ответ:

в объявлении типа ! похож на ?. Оба являются необязательными, но ! это "неявно развернул" дополнительно, что означает, что вам не нужно разворачивать его, чтобы получить доступ к значению (но оно все равно может быть нулевым).

это в основном поведение, которое мы уже имели в objective-c. a value можете быть nil, и вы должны проверить его, но вы также можете просто получить доступ к значению напрямую, как если бы это не было необязательным (с важным разница в том, что если вы не проверяете на ноль, вы получите ошибку времени выполнения)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "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
}