неожиданно обнаружил ноль при распаковке необязательного

@IBOutlet weak var groupNameTF: UITextField!
var group: Group? {
    didSet {
        groupNameTF.text = group?.name
    }
}

Не могу понять, в чем проблема с необязательным здесь. Судя по логам, group не nil. Как я и думал, я делаю безопасную развертку значения. Я также проверил с конструкцией if let, тот же результат.


person Shmidt    schedule 11.11.2014    source источник
comment
Может быть, groupNameTF ноль?   -  person Antonio    schedule 11.11.2014
comment
@Антонио да, ты абсолютно прав.   -  person Shmidt    schedule 11.11.2014


Ответы (2)


Скорее всего, это происходит потому, что groupNameTF равно нулю. Быстрый обходной путь - защитить это с помощью if:

var group: Group? {
    didSet {
        if groupNameTF != nil {
            groupNameTF.text = group?.name
        }
    }
}
person Antonio    schedule 11.11.2014
comment
Собственно, я думаю, в этом случае он должен жестко провалиться. groupNameTF является выходом. Основная причина, по которой это может быть nil, заключается в том, что вы забыли подключить его в конструкторе интерфейсов. - person JeremyP; 20.02.2020
comment
@JeremyP другой вариант заключается в том, что розетки еще не подключены - это может произойти, когда вы создаете представление (или контроллер представления) с помощью кода и сразу после установки этого свойства. Розетки будут привязаны на более позднем этапе жизненного цикла представления. - person Antonio; 20.02.2020

@ Антонио уже объяснил проблему. Альтернативное решение

var group: Group? {
    didSet {
        groupNameTF?.text = group?.name
    }
}

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

person Martin R    schedule 11.11.2014
comment
+1 хорошая мысль. Доказательство того, что вещи в swift можно сделать несколькими способами, что всегда хорошо - person Antonio; 11.11.2014
comment
@Antonio: Итак, Swift — это новый Perl :-) TIMTOWTDI! - person Martin R; 11.11.2014
comment
ахах, да, мы должны переименовать его в Swifterl :). - person Antonio; 11.11.2014