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的。这只是“荒谬”和难以想象,如果你不记得自己在那个阶段。