我遇到了一些我认为可能是错误的事情。 Swift 允许您创建一个函数数组,如下所示:
func example1(a: Int) {
println(a)
}
let functionArray1 = [example1]
println(functionArray1[0](3)) // This prints "3"
但是,如果我尝试创建一个带有 inout
参数的函数数组,我会遇到可怕的 segmentation fault 11
:
func example2(inout a: Int) {
println(a)
}
let functionArray2 = [example2] // This produces the seg fault
我是否在函数内部实际操作 a
没有区别。
有人知道这是怎么回事吗?有没有一种方法可以通过使用适当的类型注释或其他一些技巧来创建带有 inout
参数的函数数组?
编辑:我已经尝试为数组提供类型注释 - 这并不能解决问题:
let functionArray2: [(inout Int) -> ()] = [example2] // Same error...
我还尝试将函数编写为闭包(使用显式类型注释),然后将闭包添加到数组中,但也没有成功。
最佳答案
正如对该问题的评论所指出的,这确实是一个与 Swift 在某些情况下处理类型签名中的 inout
有关的错误。
在错误被解决之前,您可以使用 UnsafeMutablePointer
解决它。
func increment(a: UnsafeMutablePointer<Int>) {
a.memory += 1
}
let functionArray = [increment]
var thing = 2
functionArray2[0](&thing)
println(thing) // 3
关于arrays - 是否可以在 Swift 中创建一个采用 "inout"参数的函数数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035485/