我可以在Swift库中看到这些定义:
extension Bool : BooleanLiteralConvertible { static func convertFromBooleanLiteral(value: Bool) -> Bool } protocol BooleanLiteralConvertible { typealias BooleanLiteralType class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self }
定义为的成员函数与定义为的static func另一个成员函数有什么区别class func?仅仅static是为了结构和枚举的静态功能,以及class用于类和协议吗?还有其他应该知道的区别吗?在语法本身中具有这种区别的原理是什么?
static func
class func
static
class
是否仅将static用于结构和枚举的静态函数,将class用于类和协议?
那是主要区别。其他一些区别是类函数是动态调度的,并且可以被子类覆盖。
协议使用class关键字,但是它并未从实现协议中排除结构,而是仅使用static。为协议选择了类,因此不必使用第三个关键字来表示静态或类。
来自Chris Lattner的以下主题:
我们考虑统一语法(例如,使用“ type”作为关键字),但这实际上并不简单。关键字“类”和“静态”有助于提高熟悉度,并且具有很好的描述性(一旦您了解+方法的工作原理),并为可能向类中添加真正的静态方法打开了大门。该模型的主要怪异之处在于协议必须选择一个关键字(而我们选择了“类”),但总的来说,这是正确的权衡。
这是显示一些类函数的重写行为的代码段:
class MyClass { class func myFunc() { println("myClass") } } class MyOtherClass: MyClass { override class func myFunc() { println("myOtherClass") } } var x: MyClass = MyOtherClass() x.dynamicType.myFunc() //myOtherClass x = MyClass() x.dynamicType.myFunc() //myClass