Swift 中的屬性

存儲(chǔ)屬性

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

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

存儲(chǔ)屬性變量還可以是惰性的(用 lazy 關(guān)鍵字表征)。
存儲(chǔ)屬性常量是不可以的,因?yàn)槌A勘仨氃诔跏蓟瓿芍坝兄担栊郧笾悼赡馨l(fā)生在初始化完成之后。

計(jì)算屬性

計(jì)算屬性并不真的存儲(chǔ)一個(gè)值。TA們提供一個(gè) getter 和可選的 setter 間接獲取和設(shè)置其他屬性。

計(jì)算屬性必須使用 var 關(guān)鍵字定義。因?yàn)橛?jì)算屬性的值不是固定的,會(huì)根據(jù)計(jì)算而改變。
let 關(guān)鍵字只用于常量屬性,來表征TA們的值在實(shí)例實(shí)例化之后不會(huì)再改變)

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,計(jì)算屬性就變成只讀的。

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

屬性觀察器

使用 willSet didSet。

可以給存儲(chǔ)屬性(惰性的除外)提供觀察器,或者是任何被重寫的繼承而來的屬性(無論是存儲(chǔ)屬性還是計(jì)算屬性)。
無需給非重寫的計(jì)算屬性提供觀察器,因?yàn)榭梢灾苯釉?setter 中對(duì)值改變做出反應(yīng)。

屬性初始化時(shí),觀察器不會(huì)被調(diào)用。

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

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

屬性與全局和局部變量

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

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

類屬性

為類本身定義屬性,

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

對(duì)于值類型,存儲(chǔ)屬性和計(jì)算屬性都可以定義,使用 static 關(guān)鍵字。
對(duì)于引用類型,只可以定義計(jì)算屬性,使用 class 關(guān)鍵字。

對(duì)于存儲(chǔ)屬性,必須為其提供默認(rèn)值,畢竟,類型本身沒有初始化過程...

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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容