Swift-05-存儲(chǔ)屬性與計(jì)算屬性

  • 屬性是將值跟特定的類怀读、結(jié)構(gòu)體或者枚舉關(guān)聯(lián)绎橘。存儲(chǔ)屬性存儲(chǔ)常量或者變量作為實(shí)例的一部分胁孙,用于類和結(jié)構(gòu)體;計(jì)算屬性是用來計(jì)算一個(gè)值称鳞,可以用在類涮较、結(jié)構(gòu)體和枚舉。
  • 存儲(chǔ)屬性和計(jì)算屬性通常與特定的類型的實(shí)例關(guān)聯(lián)冈止。但是狂票,屬性也可以直接作用于類型本身,這樣的屬性成為類型屬性熙暴。
  • Swift可以定義屬性觀察器來監(jiān)控屬性值的改變苫亦,屬性觀察期可以添加到自己定義的存儲(chǔ)屬性上,也可以添加到父類繼承的屬性上

1.存儲(chǔ)屬性

  • 存儲(chǔ)屬性就是存儲(chǔ)在特定類怨咪、結(jié)構(gòu)體里的一個(gè)常量或者變量屋剑。
  • 可以在定義存儲(chǔ)屬性的時(shí)候指定默認(rèn)值。
  • 可以在構(gòu)造過程中設(shè)置或者修改存儲(chǔ)屬性的值诗眨。
// 定義一個(gè)結(jié)構(gòu)體如下唉匾,F(xiàn)ixedLengthRange代表一個(gè)創(chuàng)建后無(wú)法改變的區(qū)間
struct FixedLengthRange {
    var firstValue: Int
    let lenght: Int
}

var rangeOfThreeItens = FixedLengthRange(firstValue: 0, lenght: 3)

// rangeOfThreeItens 實(shí)例包括了名為firstValue的變量存儲(chǔ)屬性和lenght的常量存儲(chǔ)屬性
// 其中l(wèi)enght在創(chuàng)建后無(wú)法被修改

rangeOfThreeItens.firstValue = 7;

// rangeOfThreeItens 現(xiàn)在的表示7 8 9的區(qū)間

1.1 常量結(jié)構(gòu)體的存儲(chǔ)屬性

  • 當(dāng)創(chuàng)建了一個(gè)結(jié)構(gòu)體的實(shí)例并賦值一個(gè)常量,那么無(wú)法修改該實(shí)例的任何屬性。
  • 結(jié)構(gòu)體是值類型巍膘,當(dāng)值類型的實(shí)例被聲明為常量的時(shí)候厂财,它的所有屬性都變成了常量。
    當(dāng)嘗試下面的修改時(shí)峡懈,就會(huì)報(bào)錯(cuò)
let rangeOfThreeItens = FixedLengthRange(firstValue: 0, lenght: 3)
rangeOfThreeItens.firstValue = 8

1.2延遲存儲(chǔ)屬性

  • 延遲存儲(chǔ)屬性是指第一次被調(diào)用的時(shí)候才會(huì)計(jì)算其初始值的屬性璃饱,就是常說的懶加載。
  • Swift在屬性前加lazy關(guān)鍵字來標(biāo)記一個(gè)延遲存儲(chǔ)屬性肪康,延遲存儲(chǔ)屬性必須用變量(var關(guān)鍵字)荚恶。
  • 當(dāng)屬性依賴其他外部因素影響(如構(gòu)造過程,初始值復(fù)雜磷支,大量計(jì)算)谒撼,適合用延遲屬性。

// DataImporter是一個(gè)導(dǎo)入數(shù)據(jù)的類雾狈,導(dǎo)入過程會(huì)消耗大量的時(shí)間
class DataImporter {
    
    var fileName = "data.text"
    /** 導(dǎo)入數(shù)據(jù) **/
}
// DataManager用來管理和提供對(duì)這個(gè)字符串?dāng)?shù)組的訪問

class DataManager {
    
    lazy var importer = DataImporter()
    var data = [String]()
    /** 管理數(shù)據(jù) **/

}

let manager = DataManager()

manager.data.append("someData")
manager.data.append("someMore")

簡(jiǎn)單描述了一個(gè)DataManager類廓潜,導(dǎo)入文件的過程。DataManager用來管理數(shù)據(jù)的導(dǎo)入善榛,依賴與DataImporter的功能辩蛋。導(dǎo)入數(shù)據(jù)消耗太多的時(shí)間,而且DataManager也可能不導(dǎo)入數(shù)據(jù)就完成了管理數(shù)據(jù)的過程移盆。DataImporter不需要立刻創(chuàng)建悼院,只有在使用的時(shí)候才去創(chuàng)建。

print(manager.importer.fileName)

只有執(zhí)行上述代碼的時(shí)候味滞,DataImporter實(shí)例才會(huì)被創(chuàng)建舶吗。

1.3存儲(chǔ)屬性和實(shí)例變量

  • OC中邑商,提供了為類實(shí)例存儲(chǔ)值和引用提供了兩種方法,通過_XXXXX或者self.XXXXX.
  • Swift統(tǒng)一了OC的方法铐然,屬性沒有對(duì)應(yīng)的實(shí)例變量(_XXXXX)
  • 一個(gè)類型中屬性的全部信息--命名爽醋、類型蚁署、內(nèi)存管理特性,全部都在唯一的地方(類型定義中)

2.計(jì)算屬性

  • 枚舉蚂四、類光戈、結(jié)構(gòu)體除了擁有存儲(chǔ)屬性,還可以定義計(jì)算屬性遂赠。
  • 計(jì)算屬性不直接存儲(chǔ)值久妆,而是提供一個(gè)getter和一個(gè)可選的setter來間接獲取、設(shè)置其他屬性和變量的值跷睦。
// 下面定義三個(gè)結(jié)構(gòu)體筷弦,來描述一個(gè)矩形
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 * 0.5)
            let centerY = origin.y + (size.height * 0.5)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter){
            origin.x = newCenter.x - (size.width * 0.5)
            origin.y = newCenter.y - (size.height * 0.5)
        }
    }
}
// 創(chuàng)建一個(gè)矩形
var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))
// 重新設(shè)置矩形的中心點(diǎn)
let initialSquareCenter = square.center;
square.center = Point(x: 20.0, y: 20.0)

2.1便捷setter聲明

  • 如果計(jì)算屬性的setter沒有定義表示新值的參數(shù)名,則可以用默認(rèn)值newValue,上述代碼可以改寫

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

2.2只讀計(jì)算屬性

  • 只有g(shù)etter沒有setter的計(jì)算屬性
  • 只讀計(jì)算屬性總是返回一個(gè)值,可以通過點(diǎn)語(yǔ)法訪問烂琴,但是不能設(shè)置
  • 只讀計(jì)算屬性可以省略get和花括號(hào)
// 一個(gè)結(jié)構(gòu)體 爹殊,volume計(jì)算體積
struct Cuboid{
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double{
        return width * height * depth
    }
}

let newCuboid = Cuboid(width: 3.0, height: 4.0, depth: 5.0)

3.屬性觀察器

  • 屬性觀察器監(jiān)控和響應(yīng)屬性值的變化,每次屬性被設(shè)置值的時(shí)候都會(huì)調(diào)用奸绷。
  • 延遲屬性不可以設(shè)置屬性觀察器
  • 可以通過重寫屬性的方式為繼承的屬性添加觀察器
    • willSet : 在新的值被設(shè)置之前調(diào)用
    • didSet : 在新的值被設(shè)置之后調(diào)用
    • 父類的屬性在子類的構(gòu)造器被賦值時(shí)梗夸,觀察器同樣會(huì)被觸發(fā)

// StepCounter是一個(gè)計(jì)步器
class StepCounter{
    var totalStep: Int = 0{
        willSet(newTotalSteps){
            print("現(xiàn)在總步數(shù)是\(newTotalSteps)步")
        }
        didSet{
            if totalStep > oldValue{
                print("增加了\(totalStep - oldValue)步")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.totalStep = 200;
// 現(xiàn)在總步數(shù)是200,增加了200步
stepCounter.totalStep = 500;
// 現(xiàn)在總步數(shù)是500,增加了300步

4.全局變量和局部變量

全局變量是在函數(shù)、方法号醉、閉包或者其他類型之外定義的變量反症。局部變量是在函數(shù)、方法扣癣、或者閉包內(nèi)定義的惰帽。

  • 計(jì)算屬性和屬性觀察器所描述的模式也可以用于全局變量和局部變量。
  • 默認(rèn)的全局和局部變量都是存儲(chǔ)型變量父虑,跟存儲(chǔ)屬性類似该酗,它提供存儲(chǔ)空間,并且允許讀取和寫入
  • 全局和局部變量都可以定義計(jì)算屬性和添加屬性觀察器士嚎。
  • 注意N仄恰!
  • 全局的常量或者變量都是延遲計(jì)算的莱衩,跟延遲存儲(chǔ)屬性不同的地方在于爵嗅,全局的常量或者變量不需要標(biāo)記lazy。
  • 局部范圍的常量或者變量不會(huì)延遲計(jì)算笨蚁。

5.類型屬性

實(shí)例的屬性屬于一個(gè)特定的實(shí)例睹晒,實(shí)例之間的屬性相互獨(dú)立,也可以為類型本身設(shè)置屬性括细,不管類有多少的實(shí)例伪很,這些屬性只有唯一一份,這個(gè)就是類型屬性奋单。

  • 類型屬性锉试,比如所有實(shí)例都有一個(gè)常量(類似C語(yǔ)言的靜態(tài)常量),或者擁有一個(gè)變量(類似C語(yǔ)言的動(dòng)態(tài)變量)览濒。
  • 值類型的存儲(chǔ)類型屬性可以是變量或者常量呆盖,計(jì)算型屬性跟計(jì)算屬性一樣只能定義成常量屬性。
  • 注意4选应又!
  • 必須給存儲(chǔ)型類型屬性,指定一個(gè)默認(rèn)值乏苦,因?yàn)轭愋捅旧碇昕福瑹o(wú)法在初始化過程中,使用構(gòu)造器給類型屬性賦值、
  • 存儲(chǔ)型類型屬性是延遲初始化的席里,并且不要加lazy,多線程同時(shí)訪問也只會(huì)初始化一次叔磷。

5.1類型屬性語(yǔ)法

在Swift中,類型屬性是類型定義的一部分奖磁,寫在類型最外層花括號(hào)內(nèi)改基,作用域就是在該類型支持的范圍內(nèi)。

  • 用關(guān)鍵字static來定義類型屬性
  • 在類中咖为,用關(guān)鍵字class來支持子類對(duì)父類的實(shí)現(xiàn)進(jìn)行重寫秕狰。
// 只寫了只讀計(jì)算型類型屬性
struct MyStruct{

    static var storedTypeProperty = "Some Value"
    
    static var comutedTypeProperty : Int{
        return 998
    }
}

enum MyEnum{
    static var storedTypeProperty = "Some Value"
    
    static var comutedTypeProperty : Int{
        return 998
    }
    
}
class MyClass {
    static var storedTypeProperty = "Some Value"
    
    static var comutedTypeProperty : Int{
        return 998
    }
    class var overridedableComutedTypeProperty : Int{
        return 100
    }
}

5.2獲取和設(shè)置類型屬性的值

跟實(shí)例的屬性一樣,類型屬性可以用點(diǎn)語(yǔ)法來訪問躁染,只是不需要通過實(shí)例鸣哀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吞彤,隨后出現(xiàn)的幾起案子我衬,更是在濱河造成了極大的恐慌,老刑警劉巖饰恕,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挠羔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡埋嵌,警方通過查閱死者的電腦和手機(jī)破加,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雹嗦,“玉大人范舀,你說我怎么就攤上這事×俗铮” “怎么了锭环?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捶惜。 經(jīng)常有香客問我田藐,道長(zhǎng)荔烧,這世上最難降的妖魔是什么吱七? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鹤竭,結(jié)果婚禮上踊餐,老公的妹妹穿的比我還像新娘。我一直安慰自己臀稚,他們只是感情好吝岭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般窜管。 火紅的嫁衣襯著肌膚如雪散劫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天幕帆,我揣著相機(jī)與錄音获搏,去河邊找鬼。 笑死失乾,一個(gè)胖子當(dāng)著我的面吹牛常熙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碱茁,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼裸卫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了纽竣?” 一聲冷哼從身側(cè)響起墓贿,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜓氨,沒想到半個(gè)月后募壕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡语盈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年舱馅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刀荒。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡代嗤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缠借,到底是詐尸還是另有隱情干毅,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布泼返,位于F島的核電站硝逢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绅喉。R本人自食惡果不足惜渠鸽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柴罐。 院中可真熱鬧徽缚,春花似錦、人聲如沸革屠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至那婉,卻和暖如春板甘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背详炬。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工虾啦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痕寓。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓傲醉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呻率。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硬毕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容