【问题标题】:"Result of '&&' unused" warning in a do/try/catch blockdo/try/catch 块中的“'&&'未使用的结果”警告
【发布时间】:2019-09-26 06:18:09
【问题描述】:

我一直在试图弄清楚发生了什么无济于事。我已经尽可能地提炼了代码,但是如果我在项目中执行此操作,我仍然会收到“运算符 && 的结果是未使用的警告(即使它已被使用)但复制到 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)

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

【问题讨论】:

  • 游乐场的区别并不重要。 Playgrounds 旨在让您忽略返回值,因为它们通常显示在右侧排水沟中。
  • @RobNapier 哦,我明白了。我更新了标题以删除对游乐场的引用。

标签: swift


【解决方案1】:

这样做并没有错。当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
}

【讨论】:

  • 总的来说,我在编码时的建议是:不要使用诡计,说出你的意思。如果你的意思是告诉呼叫者这个词是否可以,如果不是,那么它有什么问题,然后告诉呼叫者。不要玩有趣的掷骰子游戏。
  • 我的代码最初有多个守卫,例如:guard isTooShort(word) else { return showError(.tooShort) },但我被告知将其更改为 do/catch/throws,因为它不是正确的错误处理方式。我的isTooShort 应该返回布尔值以继续检查或抛出会触发警报的错误。我真的很喜欢你建议的三向解决方案,尽管在我的实际代码中它是五向:4 个错误,1 个正确。
  • 非常好,对于五路返回值来说,这是一个更强大的案例。 — 我要说的一点是:如果一个函数旨在回答一个问题,那就回答它。如果一个函数打算某事或make某事,那么当输入无效时,您可能会抛出一个错误作为副作用。但是如果问题是“我的输入是否有效,如果不是,为什么不”,那么就回答这个问题。有no错误:当你所做的只是问一个问题时怎么会有错误?
  • 例如,您可能有一个方法howIs,它返回一个五向枚举来讲述这个词,以及一个验证检查来检查这个 is 是否是一个词,例如里面不应该有空格。 那么你可能会因为输入无效而引发错误。但在你的情况下,输入总是有效;您正在询问有关有效输入的有效问题。所以绝对没有理由扔,如果有人告诉你这样做,他们就错了。
  • 谢谢!我花了一点时间,但我现在明白了。我现在正在实现你的howIs 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多