Как мне узнать, какое охранное заявление не удалось?

Если у меня есть куча цепных операторов, как я могу диагностировать, какое условие не удалось, если не разбить мою охрану на несколько операторов?

Учитывая этот пример:

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с начала.

Что за идиоматический способ Свифта?