Опционально и распаковка

Я пытаюсь сделать следующее: у меня есть два текстовых поля, и я хочу 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 может помочь еще больше.

Другие вопросы по тегам