Swift 中的屬性

存儲屬性

作為實例一部分的常量或變量。
可以提供一個默認值,或者在初始化過程中設置(或修改)屬性的值,對常量的存儲屬性也適用。

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8

存儲屬性變量還可以是惰性的(用 lazy 關鍵字表征)。
存儲屬性常量是不可以的,因為常量必須在初始化完成之前有值,而惰性求值可能發生在初始化完成之后。

計算屬性

計算屬性并不真的存儲一個值。TA們提供一個 getter 和可選的 setter 間接獲取和設置其他屬性。

計算屬性必須使用 var 關鍵字定義。因為計算屬性的值不是固定的,會根據計算而改變。
let 關鍵字只用于常量屬性,來表征TA們的值在實例實例化之后不會再改變)

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

// newValue is used if a name for the new value is not set.
struct AlternativeRect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

去除 setter,計算屬性就變成只讀的。

struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}

屬性觀察器

使用 willSet didSet。

可以給存儲屬性(惰性的除外)提供觀察器,或者是任何被重寫的繼承而來的屬性(無論是存儲屬性還是計算屬性)。
無需給非重寫的計算屬性提供觀察器,因為可以直接在 setter 中對值改變做出反應。

屬性初始化時,觀察器不會被調用。

使用 willSet,新的值(自己定義一個名字,或者默認使用newValue)會作為常量參數傳遞。
使用 DidSet,舊的值(自己定義一個名字,或者默認使用oldValue)會作為常量參數傳遞。

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            println("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                println("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

屬性與全局和局部變量

目前為止,遇到的變量(無論全局還是局部)都是存儲變量,和存儲屬性類似。
然而,也可以定義計算變量,或者為存儲變量提供觀察器。

不過,要注意,全局的常量和變量總是惰性求值的(無需用 lazy 表征),而局部的常量和變量絕不會惰性求值。

類屬性

為類本身定義屬性,

  1. 所有實例都可以使用的常量屬性(static constant in C),
  2. 所有實例都可見的變量屬性(static variable in C)。

對于值類型,存儲屬性和計算屬性都可以定義,使用 static 關鍵字。
對于引用類型,只可以定義計算屬性,使用 class 關鍵字。

對于存儲屬性,必須為其提供默認值,畢竟,類型本身沒有初始化過程...

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static let storedConstantTypeProperty = "Some value"
    static var computedTypeProperty: Int {
        // return an Int value here
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static let storedConstantTypeProperty = "Some value"
    static var computedTypeProperty: Int {
        // return an Int value here
    }
}
class SomeClass {
    class var computedTypeProperty: Int {
        // return an Int value here
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • 1. 存儲屬性 簡單來說,每一個存儲屬性就是存儲在特定類或結構體實例里的一個常量或變量。存儲屬性可以使變量存儲屬性...
    keisme閱讀 517評論 0 0
  • Swift語法基礎(五)-- (類和結構體、屬性、方法) 本章將會介紹 類和結構體對比結構體和枚舉是值類型類是引用...
    寒橋閱讀 1,090評論 0 1
  • 由于種種原因,簡書等第三方平臺博客不再保證能夠同步更新,歡迎移步 GitHub:https://github.co...
    萌面大道閱讀 7,759評論 5 10
  • 昨天陳林向我求婚了,五年半了,沒想到真能等到這一天。 據陳林說,大學軍訓的第一天他就對我心懷鬼胎了。作為全校知名的...
    Ashley麥閱讀 231評論 1 0
  • 《春嬌救志明》是這個系列的最后一集,故事講的還是兩人之間的感情,但是此時的春嬌已經40歲,面臨“中女危機”,而36...
    自律是自由閱讀 839評論 0 48