Как 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
, как вы продемонстрировали.