OC和Swift中的static

OC:
static關鍵字表示靜態,可以放在局部變量和全局變量前面:
  • 限定做用域:對於靜態全局變量來講,針對某一源文件的以static聲明的文件級變量與函數的做用域只限於文件內(只在文件內可見),也即「內部鏈接」,於是能夠用來限定變量的做用域
  • 標明生存週期:對於靜態局部變量來講,在函數內以static聲明的變量雖然與自動局部變量的做用域相同(即做用域都只限於函數內),但存儲空間是以靜態分配而非默認的自動分配方式獲取的,於是存儲空間所在區域不一樣(通常來講,靜態分配時存儲空間於編譯時在程序數據段分配,一次分配全程有效;而自動分配時存儲空間則是於調用棧上分配,只在調用時分配與釋放),且兩次調用間變量值始終保持一致(變量只會被初始化一次);
Swift:
static在Swift 中表示 「類型範圍做用域」,可使用它來定義類型屬性,最初的時候,Swift不支持class類型的類型存儲屬性,static關鍵字只能用於非class類型中:
舊文:
static在Swift 中表示 「類型範圍做用域」,這一律念有兩個不一樣的關鍵字,它們分別是 staticclass。在非 class 的類型上下文中,咱們統一使用 static 來描述類型做用域,class 關鍵字 是專門用在 class 類型的上下文中的,能夠用來修飾類方法以及類的計算屬性。類方法就是靜態方法,經過類類型能直接調用。
class 中如今是不能出現類的(靜態)存儲屬性的,咱們若是寫相似這樣的代碼的話:

class MyClass { class var bar: Bar? }

編譯時會獲得一個錯誤:ide

class variables not yet supported函數

 
這主要是由於在 Objective-C 中就沒有類變量這個概念,爲了運行時的統一和兼容,暫時不太方便添加這個特性。Apple 表示從此將會考慮在某個升級版本中實裝 class 類型的類存儲變量,如今的話,咱們只能在 class 中用 class 關鍵字聲明方法和計算屬性。
 
Swift1.2 以後,類也能夠經過static關鍵字擁有 類型存儲屬性了,static至關於 class final標識符的別名,類中的static屬性擁有全局做用域和懶加載屬性。可是至此文章寫做完成時,還不能經過class關鍵字來定義 類型存儲屬性,僅能經過class關鍵字定義類型計算屬性。可見後續關於類型屬性之後會更加完善。
「static」 methods and properties are now allowed in classes (as an alias for class final). You are now allowed to declare static stored properties in classes, which have global storage and are lazily initialized on first access (like global variables).
 
  • 可使用static來定義類型屬性
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)
}
}
 
 
class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
    static var storedClassProp = "class property not OK"
}
 
注:因爲Swift還處於完善中,因此本文中關於Swift的一些描述可能在將來的某天失效,請注意甄別。如內容有誤,歡迎指出。
相關文章
相關標籤/搜索