Swift: логический не оператор не работает

Вопрос:

этот фрагмент кода печатает два раза “false”:

println(levelController?.died)
println(!levelController?.died)

Я не понимаю, почему экземпляр levelController создан, а атрибут die объявлен в LevelController следующим образом:

var died = false

Может ли кто-нибудь сказать мне, что я могу делать неправильно?

Лучший ответ:

Это Swift, а не Objective C.

levelController?.died не является логическим значением. Это необязательное логическое значение. Это может быть правдой, ложью или ноль. Первый println выводит false. Логический оператор not, применяемый к необязательному, возвращает false, если необязательный параметр не равен nil, и true, если необязательный параметр равен нулю. Так же, как и в C, когда применяется к указателю.

Ответ №1

В качестве полного примера, ваш код:

class Controller {
var died: Bool = false
}

var levelController: Controller? = Controller()

println(levelController?.died)
println(!levelController?.died)

Выводит следующее:

Optional(false)
false

Первая версия вашего кода levelController?.died использует цепочку опций, разворачивает levelController?.died получает доступ к died свойству. Это объясняет, почему вывод является Optional(false). Вы обычно используете его следующим образом:

if let died = levelController?.died {
if (died) {
println("I died")
}
}

Операторы if-let разворачивают это необязательное значение.

Вторая версия вашего кода !levelController?.died проверяет, является ли заданное значение равным нулю или нет. Вы заметите, что изменение, died до значения false, не имеет никакого значения.

Однако, изменяя экземпляр следующим образом:

var levelController: Controller? = nil

Результаты в !levelController?.died становятся истинными. Это не очень практичный кусок кода!

Оцените статью
TechArks.Ru
Добавить комментарий