struct System {
var method: (() -> ())?
var curMethod: Int
init() {
method = nil
curMethod = 0
}
mutating func method1() {
curMethod = 1
}
mutating func method2() {
curMethod = 2
}
}
var sys = System()
sys.method = System.method1
sys.method!()
我收到一个错误,无法将类型 (inout System) -> () -> ()' 的值分配给类型 '(() -> ())?
。我做错了什么?
最佳答案
首先,您的行 sys.method = System.method1
是错误的,因为它要求 method1
是静态函数(如类函数)而不是而不是实例函数,因此应将其更改为 sys.method = sys.method1
。但这是不允许的——错误是“错误:不允许部分应用‘变异’方法”。
如果将 System
设为类(而不是结构),则将 System.method1
替换为 sys.method1
即可>.
这样做的原因是 mutating func
实际上不仅仅是一个简单的底层函数——它是一个柯里化(Currying)函数(用编译器生成的函数柯里化(Currying)),有效地创建一个具有"new"值的结构的新副本 - 因此,您 A) 不能直接访问它(“不允许部分应用程序”)和 B)您不能将它分配给 ()->()
变量。
关于swift:将函数类型分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590478/