Class 类方法可以';不能调用,因为它需要一个参数

Class 类方法可以';不能调用,因为它需要一个参数,class,swift,Class,Swift,这只是我尝试做的一个例子: class Test{ class func b(){ a() } func a(){ println("A") } } 在另一份swift文件中,我有: Test.b() 但是当我在Test类中调用a()时,我得到一个错误,它说:调用中缺少参数 如果我写a(它建议我这样调用方法:a(Test),测试类的名称。因此我尝试给它参数self,但它不起作用函数a是一个实例方法。函数b是一个类方法。类方法不

这只是我尝试做的一个例子:

class Test{
    class func b(){
        a()
    }

    func a(){
        println("A")
    }
}
在另一份swift文件中,我有:

Test.b()
但是当我在
Test
类中调用
a()
时,我得到一个错误,它说:
调用中缺少参数


如果我写
a(
它建议我这样调用方法:
a(Test)
测试
类的名称。因此我尝试给它参数
self
,但它不起作用

函数
a
是一个实例方法。函数
b
是一个类方法。类方法不能调用实例方法,因为故事中没有实例


因此,您的代码毫无意义;我甚至无法想象您想做什么(显然,Swift编译器也无法做到)。

正如@matt所说,
b
是一个类型方法(或类,或静态,无论您如何调用它),并且需要执行一个类型(在您的例子中是
Test
):

另一方面,
a
是一种实例方法,需要调用实例

因此,调用
a
的唯一方法是使用
Test
的实例:

Test.b()
var test = Test()
test.a()
如果要从
b
调用,必须在
b
中创建
Test
的实例:

class func b() {
    var test = Test()
    test.a()
}
class func b(test: Test) {
    test.a()
}
或者将
测试的实例传递给
b

class func b() {
    var test = Test()
    test.a()
}
class func b(test: Test) {
    test.a()
}
但是,我认为您的设计中存在缺陷。
b
不应该是类方法,除非您使用它创建
Test
的实例以返回调用方:

class func b() -> Test {
    var test = Test()
    test.a()
    return test
}
在其他情况下,这种互动可能是有用的——也许如果你解释一下你想要实现什么,我们可以提供一个更好的答案

旁注:autocompletion之所以建议使用
Test
,是因为实例方法是curried类型的方法,在第一次调用时使用实例:

var test = Test()

test.a()

// Is equivalent to:

Test.a(test)()

也许C中的一个例子会有所帮助

类方法相当于C中的静态函数。它只是一个函数。实例方法(非类)相当于接受附加(隐藏)参数的C函数:作为方法调用上下文的实例

C中的等效项可能如下所示:

static void B() {
    ...
}

void A(Test test) {
    ...
}
let test = Test()
A(test,...)
除非要传递第一个参数的测试对象实例,否则不能从b()调用a()

我的意思是,在Swift中,当您有一个测试实例,并且您“调用它的一个()”:

你实际上是在做这样的事情:

static void B() {
    ...
}

void A(Test test) {
    ...
}
let test = Test()
A(test,...)

停止。重写代码,使类具有大写字母(
Test
),并在显示之前不显示。这是一个非常重要的约定。除非有实例,否则没有“self”的概念。类方法(或Swift中的“Type method”,因为结构和枚举也可以有方法)不应该调用需要实例的方法或变量,这正是您正在尝试做的。如果您只是在试验w/structure,您还可以将
func a()
设置为类/类型方法。您能告诉我应该怎么做吗?调用函数对训斥这家伙并没有特别大的帮助-人们不是天生就理解OOP的。这只是“荒谬”和难以想象,如果你不记得自己在那个阶段。