摘要:Swift中表示“類型范圍作用域”這一概念有著兩個不同的關鍵字,分別為static和class,而在OC等其他語言中,開發者不會特地區分變量/類方法和靜態變量/靜態函數。本文在這篇Tip中詳解了static和class的使用。
Swift中表示 “類型范圍作用域” 這一概念有兩個不同的關鍵字,它們分別是static和class。這兩個關鍵字確實都表達了這個意思,但是在其他一些語言,包括Objective-C中,我們并不會特別地區分類變量/類方法和靜態變量/靜態函數。但是在Swift中,這兩個關鍵字卻是不能用混的。
在非class的類型上下文中,我們統一使用static來描述類型作用域。這包括在enum和struct中表述類型方法和類型屬性時。在這兩個值類型中,我們可以在類型范圍內聲明并使用存儲屬性,計算屬性和方法。static適用的場景有這些:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
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),
Point(x: -1, y: 1),
Point(x: 1, y: -1),
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)
}
}
enum的情況與這個十分類似,就不再列舉了。
class關鍵字相比起來就明白許多,是專門用在class類型的上下文中的,可以用來修飾類方法以及類的計算屬性。要特別注意class中現在是不能出現存儲屬性的,我們如果寫類似這樣的代碼的話:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
class MyClass {
class var bar: Bar?
}
編譯時會得到一個錯誤:
class variables not yet supported
這主要是因為在Objective-C中就沒有類變量這個概念,為了運行時的統一和兼容,暫時不太方便添加這個特性。Apple表示今后將會考慮在某個升級版本中實裝class類型的類存儲變量,現在的話,我們只能在class中用class關鍵字聲明方法和計算屬性。
有一個比較特殊的是protocol。在Swift中class、struct和enum都是可以實現protocol的。那么如果我們想在protocol里定義一個類型域上的方法或者計算屬性的話,應該用哪個關鍵字呢?答案是使用class進行定義,但是在實現時還是按照上面的規則:在class里使用class關鍵字,而在struct或enum中仍然使用static——雖然在protocol中定義時使用的是class:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
protocol MyProtocol {
class 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 func foo() -> String {
return "MyClass"
}
}
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。