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
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。