Swift “如何压制”;“结果未使用”;警告

Swift “如何压制”;“结果未使用”;警告,swift,swift3,xcode8,Swift,Swift3,Xcode8,在Swift2.2中,我有一个扩展到Optional,看起来像: extension Optional { func ifNotNil<T>(_ closure:(Wrapped) -> T) -> T? { switch self { case .some (let wrapped): return closure(wrapped) case .none: retur

在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
        }
    }
}
但有时,我并不在乎结果:

myBSON["key"].string.ifNotNil {
    print($0}
}

在Swift2.2中,它就像一个符咒。但是启动新的XCode8测试版并转换成Swift3,我在任何地方都会收到警告,说我使用了第二种类型。这几乎就好像有一个隐式的
@warn\u unused\u结果
。这只是一个早期的测试错误吗?或者是我在Swift3中不能再做的事情?或者我需要在Swift3中新修复的内容?

您可以使用以下方法放弃结果:

_ = 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
        }
    }
}
扩展名可选{
@discardableResult函数ifNotNil(u-闭包:(已包装)->T)->T{
切换自身{
案例。一些(让我们包装):
返回闭合(已包装)
案例:无:
归零
}
}
}

参考:

无法使用Xcode 8重现此问题。你能提供一个完整的、可复制的例子来复制问题而不是存根代码吗。我查找了
@warn\u unused\u result
的对应项。我喜欢两者之间的对称性。一个使用camelCase,另一个使用UNU分数。一个是警告,另一个不是。在移植中,我还有一堆苹果提供的其他API,它们显然是不可丢弃的。因此,无论我在哪里有类似于
self.navigationController?.popViewController(动画:true)
的东西,我都必须向它添加
\=…
前缀。因为显然popViewController返回了一个控制器,我从来都不需要它,现在需要显式忽略它。是的,它现在有点混乱。但他们正在将所有内容转移到CamelCase:
一旦接受,该提案将删除Swift语言中最后剩下的两个snake_案例。这进一步使该语言成为小写和驼峰大小写变体的连贯和普遍使用。
是的,我个人反对这一提议。但我认为这些API在未来将被注释为
@discardableResult
。我对
@discardableResult
的感觉好坏参半——虽然我认为这是合理的(在某种程度上),但我们确实不想处理结果的实例太多了。因此,
@discardableResult
最终成为“必需”噪声,或者我们最终得到更多局部变量。最后,我认为设计师不会返回任何东西,而会添加
@discardableResult
——这迫使设计朝着令人不安的方向发展。
extension Optional {

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