我可以在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
用于类和协议吗?还有其他人应该知道的差异吗?在语法本身中有这种区别的理由是什么?
7 回答
这是主要的区别 . 其他一些区别是类函数是动态调度的,可以被子类覆盖 .
协议使用class关键字,但它不排除实现协议的结构,它们只是使用static . 为协议选择了类,因此不必使用第三个关键字来表示静态或类 .
来自Chris Lattner关于这个主题:
这是一个片段,显示了类函数的一些覆盖行为:
为了更清楚,我在这里举个例子,
static func
与final class func
相同因为它是
final
,我们不能在子类中覆盖它,如下所示:我在操场上做了一些实验并得出了一些结论 .
TL;DR
正如您所看到的,在
class
的情况下,使用class func
或static func
只是一个习惯问题 .Playground example with explanation:
资料来源:The Swift Programming Language - Type Variable Properties
根据苹果发布的Swift 2.2 Book:
“通过在方法的func关键字之前写入
static
关键字来指示类型方法 . 类也可以使用class
关键字 to allow subclasses to override the superclass’s implementation of that method . “从Swift2.0开始,Apple说:
“在协议中定义类型属性要求时,始终使用static关键字作为前缀类型属性要求 . 即使类型属性要求在类实现时可以使用类或静态关键字作为前缀,此规则也适用:”
主要区别在于结构是值类型,类是引用类型 .
复制值类型时,它会将您要复制的事物中的所有数据复制到新变量中 . 它们是两个独立的东西,改变一个不会影响另一个
制作引用类型的副本时,新变量引用与要复制的内容相同的内存位置 . 这意味着更改一个将更改另一个,因为它们都指向相同的内存位置