它刚刚将我的小型Swift项目转换为Swift 3。
这是我不理解的编译器错误:
var onLoadedClosures: [() -> ()] = []
open func onLoaded(closure: () -> ()) {
onLoadedClosures += [closure]
}
无法转换类型'[() - >的值()]'到期望的参数类型'inout _'。
我添加了inout关键字:
open func onLoaded(closure: inout () -> ()) {
onLoadedClosures += [closure]
}
然后它有效。但是为什么在数组中添加元素需要inout关键字?虽然我知道inout意味着什么。
答案 0 :(得分:3)
这是一个令人困惑的错误消息 - 问题是您需要将closure:
参数标记为@escaping
,以便允许它超出函数onLoaded(closure:)
的生命周期(按照SE-0103,封闭函数参数现在默认是非转义的。)
var onLoadedClosures: [() -> ()] = []
open func onLoaded(closure: @escaping () -> ()) {
onLoadedClosures += [closure]
}
将参数标记为inout
时它起作用的原因是因为inout
闭包按定义转义(因为它们的值在函数退出时被写回调用者)。但是在这种情况下,根本不需要inout
参数。
有关@escaping
的详情,请参阅有关更改的the Swift evolution proposal以及this relevant Q&A。