static 和 class
在Swift中static和class都表示“類型範圍作用域”的關鍵字。在所有類型中(class、static、enum)中,我們可以使用static來描述類型作用域。class是專門用於修飾class類型的。
static可以修飾屬性和方法
class Person {
// 存儲屬性
static let age: Int = 20
// 計算屬性
static var wotkTime: Int {
return 8
}
// 類方法
static func sleep() {
print("sleep")
}
}
但是所修飾的屬性和方法不能夠被重寫,也就是說static修飾的類方法和屬性包含了final關鍵字的特性。重寫會報錯如下:
class修飾方法和計算屬性
我們同樣可以使用class修飾方法和計算屬性,但是不能夠修飾存儲屬性。
而且類方法和計算屬性是可以被重寫的,可以使用class關鍵字也可以是static
class Student: Person {
// 使用class
// override class func sleep() {
// }
// override class var workTime: Int {
// return 10
// }
// 使用static
override static func sleep() {
}
override static var workTime: Int {
return 10
}
}
static和protocol
Swift中的class,struct,enum都可以實現某個指定的協議。如果我們想在protocol中定義一個類型作用域上的方法或者計算屬性,應該使用哪個關鍵字?答案顯而易見,肯定是static,因爲static是通用的。注意:在使用protocol的時候,在enum和struct中仍然使用static進行修飾,在class中,class和static都可以使用。
protocol MyProtocol {
static func foo() -> String
}
struct MyStruct: MyProtocol {
static func foo() -> String {
return "MyStruct"
}
}
enum MyEnum: MyProtocol {
static func foo() -> String {
return "MyEnum"
}
}
class MyClass: MyProtocol {
// 在 class 中可以使用 class
class func foo() -> String {
return "MyClass.foo()"
}
// 也可以使用 static
static func bar() -> String {
return "MyClass.bar()"
}
}
參考: