static 和 class
作用: 这两个关键字都是用来说明被修饰的属性或者方法是类型 (class/struct/enum) 的, 而不是类型实例的.
static 适用的场景(class/struct/enum)
修饰存储属性
修饰计算属性
修饰类型方法
- struct Point {
- let x: Double
- let y: Double
- // 修饰存储属性
- static let zero = Point(x: 0, y: 0)
- // 修饰计算属性
- static var ones: [Point] {
- return [Point(x: 1, y: 1)]
- }
- // 修饰类型方法
- static func add(p1: Point, p2: Point) -> Point {
- return Point(x: p1.x + p2.x, y: p1.y + p2.y)
- }
- }
class 适用的场景
修饰类方法
修饰计算属性
- class MyClass {
- // 修饰计算属性
- class var age: Int {
- return 10
- }
- // 修饰类方法
- class func testFunc() {
- }
- }
注意事项
class 不能修饰类的存储属性, static 可以修饰类的存储属性
//class let name = "jack" error: Class stored properties not supported in classes; did you mean 'static'?
在 protocol 中使用 static 来修饰类型域上的方法或者计算属性, 因为 struct,enum,class 都支持 static, 而 struct 和 enum 不支持 class
- protocol MyProtocol {
- static func testFunc()
- }
- struct MyStruct: MyProtocol {
- static func testFunc() {
- }
- }
- enum MyEnum: MyProtocol {
- static func testFunc() {
- }
- }
- class MyClass: MyProtocol {
- static func testFunc() {
- }
- }
static 修饰的类方法不能继承; class 修饰的类方法可以继承
- class MyClass {
- class func testFunc() {
- }
- static func testFunc1() {
- }
- }
- class MySubClass: MyClass {
- override class func testFunc() {
- }
- // error: Cannot override static method
- // override static func testFunc1() {
- //
- // }
- }
单例
- class SingleClass {
- static let shared = SingleClass()
- private init() {}
- }
总结
static 能修饰 class/struct/enum 的计算属性, 存储属性, 类型方法; class 能修饰类的计算属性和类方法
static 修饰的类方法不能继承; class 修饰的类方法可以继承
在 protocol 中要使用 static
参考
Swift Tips
来源: https://juejin.im/post/5c81e255f265da2dc9732b71