问题描述
我尝试了一个错误处理函数来破解保险箱的代码(例如),在我看来,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")
}
}
我现在无法对其进行测试,因此可能会出现语法错误。