Swift中static和class关键字的深入讲解
前言
Swift中表示“类型范围作用域”这一概念有两个不同的关键字,它们分别是static和class。这两个关键字确实都表达了这个意思,但是在其他一些语言,包括Objective-C中,我们并不会特别地区分类变量/类方法和静态变量/静态函数。但是在Swift中,这两个关键字却是不能用混的。
static和class
作用:这两个关键字都是用来说明被修饰的属性或者方法是类型(class/struct/enum)的,而不是类型实例的。
static适用的场景(class/struct/enum)
- 修饰存储属性
- 修饰计算属性
- 修饰类型方法
structPoint{
letx:Double
lety:Double
//修饰存储属性
staticletzero=Point(x:0,y:0)
//修饰计算属性
staticvarones:[Point]{
return[Point(x:1,y:1)]
}
//修饰类型方法
staticfuncadd(p1:Point,p2:Point)->Point{
returnPoint(x:p1.x+p2.x,y:p1.y+p2.y)
}
}
class适用的场景
- 修饰类方法
- 修饰计算属性
classMyClass{
//修饰计算属性
classvarage:Int{
return10
}
//修饰类方法
classfunctestFunc(){
}
}
注意事项
class不能修饰类的存储属性,static可以修饰类的存储属性
//classletname="jack"error:Classstoredpropertiesnotsupportedinclasses;didyoumean'static'?
在protocol中使用static来修饰类型域上的方法或者计算属性,因为struct、enum、class都支持static,而struct和enum不支持class
protocolMyProtocol{
staticfunctestFunc()
}
structMyStruct:MyProtocol{
staticfunctestFunc(){
}
}
enumMyEnum:MyProtocol{
staticfunctestFunc(){
}
}
classMyClass:MyProtocol{
staticfunctestFunc(){
}
}
static修饰的类方法不能继承;class修饰的类方法可以继承
classMyClass{
classfunctestFunc(){
}
staticfunctestFunc1(){
}
}
classMySubClass:MyClass{
overrideclassfunctestFunc(){
}
//error:Cannotoverridestaticmethod
//overridestaticfunctestFunc1(){
//
//}
}
单例
classSingleClass{
staticletshared=SingleClass()
privateinit(){}
}
总结
- static能修饰class/struct/enum的计算属性、存储属性、类型方法;class能修饰类的计算属性和类方法
- static修饰的类方法不能继承;class修饰的类方法可以继承
- 在protocol中要使用static
参考
- SwiftTips
- stackoverflow
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。