微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解决Swift 3中的非转义闭包问题

我有一个扩展数组的形式:

extension Array
{
    private func someFunction(someClosure: (() -> Int)?)
    {
        // Do Something
    }

    func someOtherFunction(someOtherClosure: () -> Int)
    {
        someFunction(someClosure: someOtherClosure)
    }
}

但我收到错误:将非转义参数’someOtherClosure’传递给函数,期望@escaping闭包.

两个闭包确实是非转义(认情况下),并且明确地将@noescape添加到someFunction会产生一个警告,指示这是Swift 3.1中的认值.

知道我为什么会收到这个错误吗?

– 更新 –
附上截图:

enter image description here

解决方法

如前所述,可选闭包正在逃避.另外一个补充:

Swift 3.1有一个withoutActuallyEscaping辅助函数,在这里很有用.它标记一个闭包,只是为了在传递的闭包内使用它,因此您不必将转义属性公开给函数签名.

可以像这样使用:

extension Array {

    private func someFunction(someClosure: (() -> Int)?) {
        someClosure?()
    }

    func someOtherFunction(someOtherClosure: () -> Int) {
        withoutActuallyEscaping(someOtherClosure) {
            someFunction(someClosure: $0)
        }
    }
}


let x = [1,2,3]

x.someOtherFunction(someOtherClosure: { return 1 })

希望这有用!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐