Швидкі змінні прикраси з "?" (знак питання) та «!» (знак оклику)


106

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

Я не розумію, що робить налаштування змінної з a !, тому що я був під враженням, що це "розгортає" значення з необов'язкового. Я подумав, що ви робите це, ви гарантуєте, що в цій змінній може бути відмовлено значення, саме тому в IBActions і таке, як ви бачите, це використовується.

Так просто кажучи, до чого ініціалізується змінна, коли ви робите щось подібне:

var aShape : CAShapeLayer!

І чому / коли я б це робив?


Ви зробите це, щоб сказати, що змінна nt nil після перевірки цього факту.
Маттіас

Я не думаю, що це слід позначати як дублікат. "Що є необов'язковим?" не є тим самим питанням, як "Яка різниця між двома типами необов'язкових?" що майже в чому це питання
Jiaaro

@Jiaaro навіть у цьому випадку вже є багато питань щодо необов'язкових, неявно розгорнутих факультативів тощо. Ви також можете посилатися на це: stackoverflow.com/questions/24272781/…
Джек

@JackWu Добре, але я впевнений, що це питання не було дублікатом, коли його задавали. (наприклад, просили цілий тиждень перед вашим прикладом)
Jiaaro

@Jiaaro Ви добре зазначаєте, я не помітив, що це було старше. Можливо, інший замість цього буде позначений як дублікат цього
Джек

Відповіді:


145

У типі декларації !аналогічно до ?. Обидва є необов’язковими, але опція !є " неявно розгорнутою" , тобто означає, що вам не потрібно розгортати її, щоб отримати доступ до значення (але воно все одно може бути нульовим).

Це в основному поведінка, яку ми вже мали у об’єктивному-с. Значення може бути нульовим, і ви повинні перевірити його, але ви також можете просто отримати доступ до значення, як якщо б воно не було необов’язковим (з важливою різницею, що якщо ви не перевірите нуль, ви отримаєте помилка під час виконання)

// 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
}

7
Побічно розгорнуті OPTIONALS описані в точно названому розділі на стор 56 Свіфта мови програмування .
Калеб

@Caleb Я додав посилання на відповідний розділ онлайн-документів, де я згадував неявно розгорнуті факультативи :)
Jiaaro

Чудова інформація, дякую. Взагалі любляча безпека, яку Свіфт примушує дотепер, повинна створювати набагато менше помилок :).
Джейсон Ренальдо

@Jiaaro: Дякую вам за спільний доступ. Це змушує користувача зрозуміти ідеально вище приклад. !! :)
Еша

3
Я думаю, що речення " Це в основному поведінка, яку ми вже мали в об'єкті-с " може бути заплутаною. У Objective-c можна отримати доступ до nilзначення і фактично "працювати" з ним, при швидкому доступі до неявно розгорнутого факультативу, в той час як його "нуль " викине виняток з виконання.
Саша Вовк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.