Почему UITextField.text Необязательный?
Он начинается как пустая строка вместо nil. Даже когда он явно установлен в ноль, он остается пустой строкой. Я не понимаю. Возможно, чтобы упростить очистку, назначив nil? Написание кода с ним неудобно.
var textField = UITextField()
print(textField.text) // prints "Optional("")"
textField.text = nil
print(textField.text) // prints "Optional("")"
Ответы
Ответ 1
Это историческая вещь. UITextField
не имеет никакого значения между пустой строкой и строкой nil
. В Objective-C не нужно было делать разницу между ними, потому что вы можете вызывать методы на nil
в Objective-C.
Кроме того, в Objective-C не было способа запретить пользователям присваивать свойство nil
.
Итоговый контракт заключается в том, что text
может быть необязательным. В Objective-C это не имеет значения.
В Swift мы мало что можем сделать, потому что контракт UITextField.text
должен измениться, возможно, сломав много уже написанного кода. Обратите внимание, что даже если nil
никогда не возвращается из метода, вы все равно можете назначить nil
на reset значение.
Вы можете найти сотни подобных ситуаций в старых API.
Ответ 2
Я достаточно уверен в этом, повторяя свой комментарий к ответу Султана в качестве альтернативного ответа.
Я не уверен, что ответ Султана действительно отвечает на вопрос.
Я не могу "найти сотни подобных ситуаций". Это потому, что их больше нет. Они были там в Свифт-1, но это было давно. С тех пор API были исправлены вручную, чтобы устранить их. Это не было устранено.
Вся идея ручной настройки API-интерфейсов заключалась в удалении ненужных опций. Сотни значений теоретически могут быть nil
, но на самом деле их никогда не будет, и в Swift они, следовательно, не являются опциями. Это значение никогда не может быть nil
; даже если код Objective-C устанавливает его в nil
, он не становится nil
. И заставить его не использовать в Swift не "сломать" что угодно. Поэтому нет смысла, что это необязательный параметр в Swift.
Я думаю, что правильный ответ заключается в том, что это ошибка. Во время удаления IUO при ручной настройке API-интерфейсов в начале Swift 2.0 метка и текстовое поле text
должны были быть охарактеризованы как nonOptional String, и это не так.