我试图找出一种通过数字动态调用方法的方法。这是我正在做的简化版本。
class C {
func a() {}
func b() {}
let f = [0: a, 1: b]
func call(n: Int) {
f[n]?()
}
}
let c = C()
c.call(0)
当我在操场上跑步时,我得到了
Playground execution failed: error: <REPL>:10:13: error: could not find an overload for 'subscript' that accepts the supplied arguments
f[n]?()
~~~~^~~
但如果我跑
func a() {}
func b() {}
let f = [0: a, 1: b]
f[0]?()
直接没有包含它按预期工作的类。发生了什么事?
答案 0 :(得分:10)
这真的很有趣!我注意到,如果我将函数定义移到类之外但其他所有内容保持不变,那么第一部分代码就可以了。从错误消息中我得出结论,当在类中声明函数时,需要使用类的实例调用它们。当您在类中调用a()
时,编译器会自动将其解释为self.a()
。但是,当函数存储在变量(f[0]
,f[1]
等)中时,需要首先传递class C
(self
)的实例。这有效:
class C {
func a() {println("in a")}
func b() {println("in b")}
let f = [0: a, 1: b]
func call(n: Int) {
a() // works because it's auto-translated to self.a()
f[n]?(self)() // works because self is passed in manually
}
}
let c = C()
c.call(0)