()] = [] open func onLoad-6ren">
gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:30:16 24 4
gpt4 key购买 nike

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

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

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

Cannot convert value of type '[() -> ()]' to expected argument type 'inout _'.

我添加了 inout 关键字:

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

然后就可以了。但是为什么向数组添加元素需要 inout 关键字呢?虽然我知道 inout 是什么意思。

最佳答案

这是一个令人困惑的错误消息——问题是你需要将你的 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 .

关于Swift 3 无法将 .. 类型的参数转换为预期的参数类型 "inout _",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39861313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com