do / try / catch块中的“未使用'&&'的结果”警告

时间:2019-05-08 13:31:17

标签: swift

我一直在试图弄清楚到底是怎么回事。我已经尽可能地精炼了代码,但是如果我在项目中进行操作,但仍然得到“运算符&&的结果未使用警告(即使已使用),但复制到Playground的相同代码也可以正常工作而没有警告。这只是一些伪代码,在我尝试查找问题时再次重写了基本代码之后。

enter image description here

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)

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

1 个答案:

答案 0 :(得分:3)

那样做没有错。当诸如isTooShort之类的东西属于您并且您想要调用它而不捕获结果时,“正确”的方法是将其标记为@discardableResult。如果这样做的话,你可以写

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

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

real 问题是为什么您都同时返回Bool 并引发错误。您对isTooShort的实现很奇怪。您似乎在滥用throw。目前尚不清楚您要通过以这种奇怪的方式实现它来解决什么问题。 isTooShort只能以一种方式失败:单词太短。那么为什么不返回布尔呢? isTooShort问一个简单的是/否问题,因此只需回答:返回布尔并停止。

如果您的目标是回答一个三个方式的问题-即告诉呼叫者此单词是太短,太长还是恰好正确,那么再次返回一个自定义枚举回答了这个问题:

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
}