无法调用类方法因为它需要一个参数

时间:2014-12-19 18:23:02

标签: class swift

这只是我想要做的一个例子:

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

    func a(){
        println("A")
    }
}

在另一个快速文件中我做了:

Test.b()

但是当我在我的a()课程中致电Test时,我收到错误:missing argument in call

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

3 个答案:

答案 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,...)