2016-10-04 39 views
3

它只是将我的小雨燕项目斯威夫特3.斯威夫特3不能转换类型的参数..预期参数类型“INOUT _”

这里是我不明白一个编译器错误:

var onLoadedClosures: [() ->()] = [] 
open func onLoaded(closure:() ->()) { 
    onLoadedClosures += [closure] 
} 

无法将类型'[() - >()]'的值转换为期望的参数类型'inout _'。

我加了INOUT关键字:

open func onLoaded(closure: inout() ->()) { 
     onLoadedClosures += [closure] 
    } 

然后,它的工作原理。但为什么向数组添加元素需要inout关键字?虽然我知道什么意思。

回答

3

这是一个令人困惑的错误消息 - 问题是,你需要标记您的closure:参数作为@escaping以使其逃过功能onLoaded(closure:)的寿命(按SE-0103,closure函数现在非逃逸默认)。

var onLoadedClosures: [() ->()] = [] 
open func onLoaded(closure: @escaping() ->()) { 
    onLoadedClosures += [closure] 
} 

当你标记参数作为inout是因为inout关闭被定义逃脱(如自己的价值得到在退出函数写回给调用者),它的工作原理的原因。但是在这种情况下,根本不需要inout参数。

有关@escaping的详细信息,请参阅the Swift evolution proposal上的更改以及this relevant Q&A

相关问题