Как swift guard определяет true или false при использовании оператора =

Изучите swift 3.1, прочитав Руководство по языку (developer.apple.com). Я узнал, что в swift оператор присваивания (=) не возвращает значение. В главе " Поток управления" приведен пример охранного оператора:

func greet(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }

    print("Hello \(name)!")

    guard let location = person["location"] else {
        print("I hope the weather is nice near you.")
        return
    }

    print("I hope the weather is nice in \(location).")
}

Мой вопрос, если оператор '=' не возвращает значение, то:

guard let name = person["name"] else {
    return
}  

Как охранник определяет, что name = person["name"] является истинным или ложным, и в зависимости от того, переходят к else и возвращаются?

2 ответа

Решение

Цель защиты состоит в том, чтобы утверждать, что значение не равно нулю, и гарантировать выход из текущей области, если оно есть. Это позволяет использовать значение в остальной части вашей функции и позволяет не вкладывать ваш "золотой путь" в несколько операторов if.

Вы можете сделать что-то подобное с синтаксисом if-let, но это не дает никаких гарантий того, что область должна быть закрыта или предоставить это защищенное значение за пределами его собственной области.

guard let name = person["name"] else {
    return
}
// name available here!

против

if let name = person["name"] {
    // name available here
} else {
    // name not available here
}

// name not available here either

Все это основано на том, могут ли утверждения if / guard гарантировать существование значения, а не на достоверности.

Как отметил @Hasmish, let name = person["name"] это optional-binding-condition, Он оценивается как истина, когда правая сторона не nilи имеет побочный эффект связывания обернутого значения с идентификатором на левой стороне.

optional-binding-condition не имеет никакого отношения к тому, является ли правая сторона true / false,

let optionalBool: Bool? = false
guard let bool = optionalBool else {
    fatalError("This will never be called, because `optionalBool` is not `nil`")
}

На самом деле, правая сторона даже не должна быть Bool, как вы продемонстрировали.

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