Являются ли выражения "guard let" и "if let" отличными от "guard" и "if"? - PullRequest
1 голос
/ 06 марта 2019

Я знаю, что охранное заявление можно использовать вот так

guard let someConstant = someOptional() else {
    // ...
}

И я пытался сделать

struct MyStruct {
    let aString: String
    init?() {
        guard aString = optionalString() else { return }
    }
// ...

но, похоже, не работает.

Я предполагал, что let a = b и a = b каким-то образом будут иметь логическое значение, которое было ложным, когда оно не удалось, но действительно ли guard let и guard совершенно разные?

1 Ответ

1 голос
/ 06 марта 2019

Необязательная привязка в операторе if работает следующим образом: она проверяет, имеет ли данное значение значение и соответствует ли оно этому значению if block

if let constant = optional {
    constant
}

При необязательном связывании в операторе guard он проверяет, существует ли значение и, если существует, он продолжается в текущей области с переменной / константой, назначенной в этой области

guard let constant = optional else { ... }
constant

Итак, для вашего инициализатора вам нужно назначить константу, поэтому вам нужно использовать ключевое слово let, а ваш инициализатор необязателен, вам нужно вернуть nil, если инициализация не удалась

guard let aString = optionalString() else { return nil }
self.aString = aString
...