首页 > 解决方案 > websiteUp 设置为 false,但不打印失败

问题描述

我正在尝试学习 Swift/Xcode,但遇到了一个我无法解释的错误。

这是一些应该打印错误代码的代码,但即使我已将 websiteUp 更改为 false,仍然会打印 Success!

enum WebpageError: Error {
case success
case failure(Int)
}
func getWebpage(uRL: String, siteUp: Bool) throws -> String {
if siteUp == false {
    WebpageError.failure(404)
}
return "Success"
}
let webpageURL = "http://apple.com"
let websiteUp = false
do {
let status = try getWebpage(uRL: webpageURL, siteUp: websiteUp)
print(status)
} catch {
print(error)
}

我看不出有什么问题,因为在我看来一切正常!

标签: swift

解决方案


你正在做两件愚蠢的事情:

  • case错误枚举的 a怎么可能是 a .success?是为了失败!

  • 光说 是不够的WebpageError.failure。你必须throw犯错误。

所以:

enum WebpageError: Error {
    case failure(Int) // <== look
}
func getWebpage(uRL: String, siteUp: Bool) throws -> String {
    if !siteUp {
        throw WebpageError.failure(404) // <== look
    }
    return "Success"
}
let webpageURL = "http://apple.com"
let websiteUp = false
do {
    let status = try getWebpage(uRL: webpageURL, siteUp: websiteUp)
    print(status)
} catch {
    print(error)
}

说了这么多,让我们回到你为什么包含一个.success案例的问题。也许您的想法是返回一个表明成功或失败的值。那将是一个结果。像这样:

enum WebpageError: Error {
    case failure(Int)
}
func getWebpage(uRL: String, siteUp: Bool) -> Result<String,Error> {
    return Result {
        if !siteUp {
            throw WebpageError.failure(404)
        }
        return "Success"
    }
}
let webpageURL = "http://apple.com"
let websiteUp = false
let status = getWebpage(uRL: webpageURL, siteUp: websiteUp)
do {
    try print(status.get())
} catch {
    print(error)
}

这可能比你在这个阶段想象的更复杂,但值得考虑。


推荐阅读