以这种方式定义函数究竟意味着什么:
class Foo {
private class func bar() {
//do something cool
}
}
换句话说,第二个class
关键字的目的是什么?
使用Swift 2.1。
答案 0 :(得分:6)
class
和static
方法是通过类型而不是实例调用的。
let x = NSString.pathWithComponents(["/", "usr", "local", "bin", "brew"])
任何类型都可以有static
个方法,class
方法可能只出现在类上。子类可以覆盖class
方法,但不能覆盖static
个方法。
class Foo {
class func bar() -> String {
return "foo bar"
}
static func baz() -> String {
return "foo baz"
}
}
class Bar: Foo {
override class func bar() -> String {
return "bar bar"
}
}
答案 1 :(得分:3)
它只是在类本身而不是类的实例上声明函数。
class Foo {
private class func omg() -> String {
return "OMG"
}
}
Foo.omg() => "OMG"
致电
let f = Foo()
f.omg() => Static member 'omg' cannot be used on instance of type 'Foo'
所以你可以看到差异
答案 2 :(得分:1)
它是一个类函数,所以你可以在类上调用它,没有类实例。它与java / c ++中的static相同
class A {
public class func f() {
print("hey")
}
}
A.f()
答案 3 :(得分:1)
函数签名中class关键字的用途是声明必须在类的类型本身上调用该函数。也就是说,您不需要实例化类类型的对象,实际上也无法在该类型的实例上调用此函数。
Cocoa Touch有这样的例子。以UIImage(命名:String)为例。 UIImage类为您提供了通过其名称从包中获取图像的功能。但是没有UIImage的实例可以调用这个方法(事实上,没有,因为这个函数调用是你用来获取图像的第一个)。