Swift 3无法将类型的参数转换为预期的参数类型“inout _”

时间:2016-10-04 20:36:35

标签: swift swift3

它刚刚将我的小型Swift项目转换为Swift 3。

这是我不理解的编译器错误:

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

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

我添加了inout关键字:

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

然后它有效。但是为什么在数组中添加元素需要inout关键字?虽然我知道inout意味着什么。

1 个答案:

答案 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