2014-12-19 15 views
-1

这仅仅是什么,我试图做一个例子:类方法不能被称为导致它需要一个参数

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

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

而在其他文件迅疾我做的:

Test.b() 

但我得到一个错误,当我在Test级呼叫a()它说:missing argument in call

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

+0

停下。重写你的代码,让类有大写字母('Test'),并且在你做之前不要显示它。这是一个非常重要的惯例。 – matt

+0

除非有实例,否则没有“自我”的概念。类方法(或Swift中的“Type Method”,因为structs&enums也可以有方法)不应该调用需要实例的方法或变量,这就是你要做的。如果你只是试验w /结构,你也可以使用'func a()'类/类型方法。 – mc01

回答

2

正如@马特说,b是一种方法(或类,或静态的,但你怎么称呼它),并要求执行的类型(而你的情况是Test):

Test.b() 

另一方面,a是一个实例方法,并且需要调用一个实例。

所以叫a的唯一途径是与Test一个实例:

var test = Test() 
test.a() 

如果你想从b打电话,你要么在b创建Test一个实例:

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的原因是实例方法令行禁止类型的方法,以一个实例在第一次调用:

var test = Test() 

test.a() 

// Is equivalent to: 

Test.a(test)() 
0

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

因此你的代码是没有意义的;我甚至无法想象你想要做什么(显然,Swift编译器)。

+0

你能告诉我该怎么办?去调用函数a –

+0

不要特别有帮助,反对这个人 - 人们不是天生就理解OOP。这只是“无意义的”,如果你不记得自己在这个阶段是不可想象的。 – mc01

0

也许在C为例会有帮助吗?

A 类方法相当于从C中的静态函数。这只是一个功能。一个实例方法(非类)相当于一个C函数,它接受一个额外的(隐藏)参数:作为方法调用的上下文的实例。

由C的等效可能是这样的:

static void B() { 
    ... 
} 

void A(Test test) { 
    ... 
} 

不能调用一个()B()除非你有一个测试对象实例以通为先参数。

我的意思是,在斯威夫特,当你有一个测试实例和你“呼吁它一个()”:

let test = Test() 
test.a(...) 

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

let test = Test() 
A(test,...) 
相关问题