微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的for-in循环不起作用?迅速处理错误

如何解决为什么我的for-in循环不起作用?迅速处理错误

我尝试了一个错误处理函数来破解保险箱的代码(例如),在我看来,for-in循环应该打印出数组中的所有尝试... 但事实是,只有数组的第一个String会被打印,而其他的则不是。谁能告诉我我的失败在哪里?

enum SafeError: Error {
    case wrongCode
    case tooMuchTries
    case safeIsOpen
}

 struct Safe {
    var safeIsclosed: Bool
    var code: String
    var maximumTries: Int
    mutating func OpenSafe(triedCodes: [String]) throws {
        guard safeIsclosed else {
            throw SafeError.safeIsOpen
        }
        for triedCode in triedCodes {
            print("Try \(triedCode)")
            
        
            guard triedCode == code else {
                throw SafeError.wrongCode
            }
        }
        guard triedCodes.count <= maximumTries else {
            throw SafeError.tooMuchTries
        }

    print("Password was correct")
        
    }
    
}
var safe = Safe(safeIsclosed: true,code: "WD1146",maximumTries: 5)

do {
    try safe.OpenSafe(triedCodes: ["DD377789","123456","WD1146","112378AADD","DDFG4567"])
} catch SafeError.safeIsOpen {
    print("Safe is already open")
} catch SafeError.tooMuchTries {
    print("Safe is closed Now,your try was wrong")
} catch SafeError.wrongCode {
    print("Wrong Password")
} catch {
    print("Error")
}

谢谢!

解决方法

从函数调用throw会立即终止该函数的执行。这意味着一旦triedCodes的第一个元素错误,函数就会终止,因为抛出了.wrongCode错误。

我建议您修改函数,以便检查triedCodes数组中是否包含正确的代码,并在错误的情况下引发错误。这样可以确保在引发错误之前检查整个数组。

mutating func openSafe(triedCodes: [String]) throws {
    guard safeIsclosed else {
        throw SafeError.safeIsOpen
    }

    guard triedCodes.contains(code) else {
        throw SafeError.wrongCode
    }

    guard triedCodes.count <= maximumTries else {
        throw SafeError.tooMuchTries
    }
}
,

一旦遇到第一个异常,便会退出循环。

尝试像这样更改结构:

struct Safe {
var safeIsclosed: Bool
var code: String
var maximumTries: Int

func OpenSafe(triedCode: String) throws {
    guard safeIsclosed else {
        throw SafeError.safeIsOpen
    }
    print("Try \(triedCode)")
    
    guard triedCode == code else {
        throw SafeError.wrongCode
    }
}

mutating func OpenSafe(triedCodes: [String]) throws {
    guard safeIsclosed else {
        throw SafeError.safeIsOpen
    }
    for triedCode in triedCodes {
        do {
            try safe.OpenSafe(triedCode: triedCode)
        } catch SafeError.safeIsOpen {
            print("Safe is already open")
        } catch SafeError.wrongCode {
            print("Wrong Password")
        } catch {
            print("Error")
        }
    }
    guard triedCodes.count <= maximumTries else {
        throw SafeError.tooMuchTries
    }

    print("Password was correct") 
}
}

我现在无法对其进行测试,因此可能会出现语法错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。