如何消除“未使用结果”警告

4
在Swift2.2中,我有一个扩展Optional的代码如下:
extension Optional {
    func ifNotNil<T>(_ closure:(Wrapped) -> T) -> T? {
        switch self {
        case .some (let wrapped):
            return closure(wrapped)
        case .none:
            return nil
        }
    }
}

它允许编写如下代码:
anImageView.image = self.something.ifNotNil { self.getImageFor($0) }

有时候,我并不在乎结果:
myBSON["key"].string.ifNotNil {
    print($0}
}

在Swift2.2中,它非常好用。但是在新的XCode8 Beta上启动并转换为Swift3时,我得到了任何执行第二个类型的警告。这似乎就像有一个隐含的@warn_unused_result。这只是早期beta版本的错误吗?还是我在Swift3中不能再做某些事情了?或者是我需要在Swift3中进行新的修复?

无法在Xcode 8上重现此问题。你能否提供一个完整的、可复现的示例来重现这个问题,而不是存根代码? - JAL
1个回答

9
您可以使用以下方法来丢弃结果:
_ = myBSON["key"].string.ifNotNil {
    print($0}
}

或者标记您的方法,以免警告未使用的结果:

extension Optional {

    @discardableResult func ifNotNil<T>(_ closure:(Wrapped) -> T) -> T? {
        switch self {
        case .some (let wrapped):
            return closure(wrapped)
        case .none:
            return nil
        }
    }
}

Reference : SE-0047


1
抱怨。我在寻找与@warn_unused_result相对应的东西。两者之间的对称性真是让人爱不释手。一个使用驼峰命名法,另一个使用下划线。一个是警告,另一个则不是。 - Travis Griggs
1
在移植过程中,我还使用了一堆苹果提供的其他API,这些API显然是不能丢弃的。所以无论我在哪里使用 self.navigationController?.popViewController(animated: true) 这样的代码时,我都必须在前面添加 _ = ... 前缀。因为显然 popViewController 返回一个控制器,而我从来没有需要过它,现在需要明确地忽略它。 - Travis Griggs
是的,现在有点混乱。但他们正在将所有内容转换为驼峰式命名法:一旦被接受,这个提案将移除 Swift 语言中最后剩余的两个 snake_case 实例。这进一步将该语言引入了一个统一使用小写和驼峰式变量名的状态。 - Guilherme Torres Castro
是的,我个人反对这个提案。但我认为那些API将来会用@discardableResult进行注释。 - Guilherme Torres Castro
1
我对 @discardableResult 有着复杂的感受 - 尽管在某种程度上它很合理,但有时我们确实不想处理结果。因此,@discardableResult 最终只成为“必须”的噪音,或者我们最终会得到更多的本地变量。最终,我认为设计师们会选择不返回任何东西,而不是添加 @discardableResult - 这将迫使设计朝着令人不安的方向发展。 - Lloyd Sargent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接