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

时间:2020-08-19 11:27:29

标签: swift error-handling for-in-loop

我尝试了一个错误处理函数来破解保险箱的代码(例如),在我看来,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")
}

谢谢!

2 个答案:

答案 0 :(得分:1)

从函数调用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
    }
}

答案 1 :(得分:0)

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

尝试像这样更改结构:

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") 
}
}

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