Опционально и распаковка
Я пытаюсь сделать следующее: у меня есть два текстовых поля, и я хочу print()
сообщение в консоль, если текстовое поле имени пользователя .isEmpty
или если поле пароля .isEmpty
, Первое, что я заметил, это то, что текстовые поля являются необязательными, поскольку они, конечно, могут быть пустыми. Так может ли кто-нибудь объяснить мне некоторые синтаксис и обоснование следующих примеров кода?
Q1: Почему я должен развернуть после .isEmpty
?
if(self.username.text?.isEmpty)! {
print("Something!")
}
Q2: почему этот синтаксис не работает, когда вы включаете оператор или?
if(self.username.text?.isEmpty || self.password.text?.isEmpty)! {
print("Please provide username and password!")
}
Q3: Почему я не могу развернуть сразу после .isEmpty
?
if(self.username.text?.isEmpty! || self.password.text?.isEmpty!) {
print("Please provide username and password!")
}
2 ответа
Q1: Вы должны развернуть, потому что text
собственность может быть nil
, Может быть, потому что это допустимое значение, может быть, потому что это артефакт преобразования Objective-C, и это действительно nil_resettable
,
С помощью !
небезопасно, потому что может произойти сбой при каждом доступе к тексту, если он не задан.
Попробуйте что-то вроде этого
if self.username.text?.isEmpty == false {
print("Something!")
}
Swift имеет неявное, необязательное для необязательного продвижения, если обязательный тип является необязательным.
Сначала это было Bool? == Bool
и это изменилось на Bool? == Bool?
Q2: почему этот синтаксис не работает, когда вы включаете оператор или?
let a: Bool? = self.username.text?.isEmpty
let b: Bool? = self.password.text?.isEmpty
let c = a || b // the problem here is that `Bool?` doesn't implement
// the operator `||` as it's not clear how this would
// work with optionals.
Ты хочешь сделать:
guard let username = self.username.text,
let password = self.password.text,
!username.isEmpty,
!password.isEmpty {
print("Please provide username and password!")
return
}
// code using username as String and password as String (not optionals)
Q3:
Вы должны исправить ваши скобки.
if (self.username.text?.isEmpty)! || (self.password.text?.isEmpty)! {
print("Please provide username and password!")
}
Пожалуйста, помните, чтобы не использовать !
в производственном коде. Это небезопасно. Используйте вариант из Q2.
Q1: Почему я должен развернуть после.isEmpty?
if(self.username.text?.isEmpty)! {
print("Something!")
}
if
структура заявления заставляет вас иметь true/false
в теле, чтобы упростить:
let condition = false
if condition {...}
Когда вы развернете это утверждение self.username.text?.isEmpty
вы говорите компилятору "я обещаю, что это никогда nil
"Даже, что это может быть.
Q2: почему этот синтаксис не работает, когда вы включаете оператор или?
По той же причине, что и до ввода для or
/and
оператор должен быть не nil
(Развернутый).
Обратите внимание на строку ниже. Если вы попытаетесь оценить это утверждение, вы увидите, что вы пытаетесь развернуть логическое значение с двумя дополнительными параметрами в качестве параметров.
if(self.username.text?.isEmpty || self.password.text?.isEmpty)! {
Q3: Почему я не могу развернуть сразу после.isEmpty?
Я предполагаю здесь, основываясь на проблеме, которую вы представили.
isEmpty
не является обязательным, это может быть true / false, поэтому не может быть развернуто.
Это утверждение self.username.text?.isEmpty
необязательно, это может быть true/false/nil
и может быть развернут.
Я надеюсь, что это помогает прояснить ситуацию. Чтение дополнительных опций и анализ примеров кода Apple может помочь еще больше.