这只是我想要做的一个例子:
class Test{
class func b(){
a()
}
func a(){
println("A")
}
}
在另一个快速文件中我做了:
Test.b()
但是当我在我的a()
课程中致电Test
时,我收到错误:missing argument in call
如果我写a(
,建议我调用这样的方法:a(Test)
,Test
作为类的名称。所以我尝试给它参数self
,但它不起作用
答案 0 :(得分:2)
正如@matt所说,b
是一种类型方法(或类,或静态,但你想调用它),并且需要执行一个类型(在你的情况下是Test
):
Test.b()
另一方面,a
是一个实例方法,需要调用实例。
因此,调用a
的唯一方法是使用Test
的实例:
var test = Test()
test.a()
如果您想从b
致电,则必须在Test
中创建b
的实例:
class func b() {
var test = Test()
test.a()
}
或将Test
的实例传递给b
:
class func b(test: Test) {
test.a()
}
但是我认为你的设计存在缺陷。 b
不应该是类方法,除非您使用它来创建Test
的实例以返回给调用者:
class func b() -> Test {
var test = Test()
test.a()
return test
}
可能还有其他情况,这种互动可能有用 - 也许如果你解释你想要实现的目标,我们可以提供更好的答案。
附注:自动完成建议Test
的原因是实例方法是curry类型方法,在第一次调用时获取实例:
var test = Test()
test.a()
// Is equivalent to:
Test.a(test)()
答案 1 :(得分:0)
函数a
是一个实例方法。函数b
是一个类方法。类方法不能调用实例方法,因为故事中没有 no instance 。
因此你的代码没有意义;我甚至无法想象你认为你想要做什么(显然,Swift编译器也没有。)
答案 2 :(得分:0)
也许C的例子有帮助吗?
类方法相当于来自C的静态函数。它只是一个函数。 实例方法(非类)相当于一个带有附加(隐藏)参数的C函数:作为方法调用的上下文的实例。
C中的等价物可能如下所示:
static void B() {
...
}
void A(Test test) {
...
}
除非您为第一个参数传递 Test 对象实例,否则无法从 b()调用 a()。
我的意思是,在Swift中,当你有一个Test实例并且你“在其上调用 a()时”:
let test = Test()
test.a(...)
你实际上是在做这样的事情:
let test = Test()
A(test,...)