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? } 

編譯時會得到一個錯誤:

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的一些描述可能在未來的某天失效,請注意甄別。如內容有誤,歡迎指出。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM