首页 > 解决方案 > do/try/catch 块中的“'&&'未使用的结果”警告

问题描述

我一直试图弄清楚发生了什么无济于事。我已经尽可能多地提炼了代码,但如果我在项目中执行此操作,我仍然会收到“运算符 && 的结果是未使用的警告(即使已使用)但复制到 Playground 的相同代码工作正常且没有警告.这只是一些虚拟代码,在我试图找到问题的同时再次重写基本代码之后。

在此处输入图像描述

enum WordError: Error {
    case tooShort
    case tooLong
}


func isTooShort(_ word: String) throws -> Bool {
    if word.count < 3 { throw WordError.tooShort }
    return true }

func isTooLong(_ word: String) throws -> Bool {
    if word.count > 5 { throw WordError.tooLong }
    return true }


func check(_ word: String) {

    do {
        try isTooShort(word) && isTooLong(word)
        print(word)
    } catch let error as WordError {
        print("\(error)")
    } catch {
    }
}

这只是一个错误还是我在这里做错了什么?

我想如果我使用,我可以使警告静音:

 try _ = isTooShort(word) && isTooLong(word)

但我不确定这是否是“修补”它的正确方法。

标签: swift

解决方案


这样做并没有错。“正确”的方法是,当类似的东西isTooShort属于你并且你想在不捕获结果的情况下调用它时,用 . 标记它@discardableResult。如果你这样做了,那么你可以写

do {
    try isTooShort(word)
    try isTooLong(word)
    print(word) // if we get here, it's neither too short nor too long
} catch ...

但在这种情况下,你所做的也是“正确的”。

真正的问题是为什么你会返回一个 Bool抛出一个错误。你的实现isTooShort很奇怪。你似乎在滥用throw. 目前尚不清楚您以这种奇怪的方式实现它试图解决什么问题。isTooShort只能失败一种方式:字太短。那么为什么它不只返回一个布尔值呢?isTooShort问一个简单的是/否问题,所以只需回答它:返回一个 Bool 并停止。

如果您的目标是回答一个方面的问题 - 即,告诉调用者这个词是太短、太长还是恰到好处,那么再次返回一个回答问题的自定义枚举:

enum WordLength {
    case tooShort
    case tooLong
    case justRight
}

func howIs(_ word: String) -> WordLength {
    if word.count < 3 { return .tooShort }
    if word.count > 5 { return .tooLong }
    return .justRight
}

推荐阅读