一尘不染

Swift中的静态函数和类函数有什么区别?

swift

我可以在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用于类和协议吗?还有其他应该知道的区别吗?在语法本身中具有这种区别的原理是什么?


阅读 271

收藏
2020-07-07

共1个答案

一尘不染

是否仅将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
2020-07-07