Если у Ive есть куча прикованных инструкций let, как я могу диагностировать, какое условие потерпело неудачу, не разрывая мой страж, вдаваясь в несколько утверждений?
В этом примере:
guard let keypath = dictionary["field"] as? String,
let rule = dictionary["rule"] as? String,
let comparator = FormFieldDisplayRuleComparator(rawValue: rule),
let value = dictionary["value"]
else
{
return nil
}
Как я могу определить, какой из операторов с 4-мя сообщениями был неудачным и вызвал блокировку else?
Простейшая вещь, о которой я могу думать, состоит в том, чтобы вывести утверждения в 4 последовательных выражения guard else, но это неправильно.
guard let keypath = dictionary["field"] as? String
else
{
print("Keypath failed to load.")
self.init()
return nil
}
guard let rule = dictionary["rule"] as? String else
{
print("Rule failed to load.")
self.init()
return nil
}
guard let comparator = FormFieldDisplayRuleComparator(rawValue: rule) else
{
print("Comparator failed to load for rawValue: \(rule)")
self.init()
return nil
}
guard let value = dictionary["value"] else
{
print("Value failed to load.")
self.init()
return nil
}
Если бы я хотел оставить их в одном охранном заявлении, я могу подумать о другом варианте. Проверка на нуль внутри инструкции охраны может работать:
guard let keypath = dictionary["field"] as? String,
let rule = dictionary["rule"] as? String,
let comparator = FormFieldDisplayRuleComparator(rawValue: rule),
let value = dictionary["value"]
else
{
if let keypath = keypath {} else {
print("Keypath failed to load.")
}
// ... Repeat for each let...
return nil
}
Я даже не знаю, будет ли это компилироваться, но тогда я мог бы также использовать кучу операторов if let
или guard
.
Какой идиоматический способ Быстро?