Как мне узнать, какое охранное заявление не удалось?
Если у меня есть куча цепных операторов, как я могу диагностировать, какое условие не удалось, если не разбить мою охрану на несколько операторов?
Учитывая этот пример:
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 операторов let был тем, который не удался и вызвал блок else?
Самая простая вещь, о которой я могу подумать, - это разбить операторы на 4 последовательных защитных оператора 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
}
Если бы я хотел сохранить их всех в одном охранном заявлении, я мог бы придумать другой вариант. Проверка на nils внутри оператора защиты может сработать:
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
с начала.
Что за идиоматический способ Свифта?