Swift之屬性

Swift 屬性將值跟特定的類隘膘、結(jié)構(gòu)或枚舉關(guān)聯(lián)疑故。
屬性可分為存儲屬性和計算屬性:

存儲屬性

簡單來說,一個存儲屬性就是存儲在特定類或結(jié)構(gòu)體的實例里的一個常量或變量弯菊。
存儲屬性可以是變量存儲屬性(用關(guān)鍵字var定義)纵势,也可以是常量存儲屬性(用關(guān)鍵字let定義)。

  • 存儲常量或者變量的
  • 要么給它默認值管钳,要么在構(gòu)造方法里初始化

計算屬性

  • 計算屬性不直接存儲值
  • 訪問時候調(diào)用get,賦值調(diào)用set,類似java里的封裝
  • get里一定要有return
  • set中有一個內(nèi)置的newValue變量,用于接收外界賦的新值
  • set里不能給當前的計算屬性賦值钦铁,否則死循環(huán)
  • 只讀計算屬性:只提供get,沒有set才漆,在寫的時候可以省略get{}

計算屬性

  • 計算屬性不直接存儲值
  • 訪問時候調(diào)用get,賦值調(diào)用set,類似java里的封裝
  • get里一定要有return
  • set中有一個內(nèi)置的newValue變量,用于接收外界賦的新值
  • set里不能給當前的計算屬性賦值牛曹,否則死循環(huán)
  • 只讀計算屬性:只提供get,沒有set醇滥,在寫的時候可以省略get{}

類屬性

  • 類屬性用static修飾
  • 類屬性是和類關(guān)聯(lián)的黎比,而不是單獨屬于某個對象
  • 只能通過類名來訪問,這點和java不同
    class Student{
    //存儲屬性
    var age:Int = 0
    var javaScore:Double = 0.0
    var htmlScore:Double = 0.0
    //計算屬性
    var averageScore:Double {
    //獲取值
    get{
    print("get被調(diào)用")
    return (javaScore+htmlScore)/2 //get中必須有return語句
    }
    //賦值
    set{
    print("set被調(diào)用,(newValue)")
    //self.averageScore = newValue 不要再set里給計算屬性賦值鸳玩,否則死循環(huán)
    }
    }
    //只讀計算屬性
    var averageScore2:Double {
    //獲取值
    get{
    print("get被調(diào)用")
    return (javaScore+htmlScore)/2
    }
    }
    //只讀計算屬性-省略get{}
    var averageScore3:Double {
    //獲取值
    print("get被調(diào)用")
    return (javaScore+htmlScore)/2
    }
    //類屬性
    static var courseCount:Int = 2
    }
    var stu = Student()
    //使用存儲屬性
    stu.age = 18
    stu.javaScore = 90
    stu.htmlScore = 60

//使用計算屬性
print(stu.averageScore)
stu.averageScore = 100

//只讀計算屬性
print(stu.averageScore2)
print(stu.averageScore3)

//使用類屬性
print(stu.courseCount)//不能通過對象訪問
print(Student.courseCount)

懶加載屬性(懶屬性)

懶加載屬性的引入
需求:需要對區(qū)間進行計算阅虫,假設(shè)該計算計算量很大,很耗時,把最終計算結(jié)果放到result變量中
class CloseRange{
var start:Int = 0
var end:Int = 1000
//方案:result設(shè)計為計算屬性
var result:Int{
get{
print("開始計算...")
var res = 0
//此時采用求和操作來模擬進行大量計算不跟。
for i in self.start...self.end{
res += i
}
return res
}
}
var range = CloseRange()
print(range.result)
print(range.result)
print(range.result)
print(range.result)
懶加載的使用:
lazy var 變量:類型 = { 代碼段}()

  • 只會賦值一次
  • 只有在第一次使用的時候颓帝,才會執(zhí)行閉包,然后把閉包返回值賦值給屬性
  • 用的時候,才會計算购城,計算1次吕座,并且能把計算結(jié)果保存下來

class CloseRange{
var start:Int = 0
var end:Int = 1000
//方案:result設(shè)計為懶加載屬性
lazy var result:Int = {
()->Int in
print("開始計算...")
var res = 0
//此時采用求和操作來模擬進行大量計算。
for i in self.start...self.end{
res += i
}
return res
}()
}
var range = CloseRange()
print(range.result)//只有第一次調(diào)用的時候執(zhí)行閉包工猜,干活只干1次米诉!
print(range.result)
print(range.result)
print(range.result)
<meta charset="utf-8">

<article class="_2rhmJa">

屬性觀察器

  • 監(jiān)聽和響應(yīng)屬性值的變化
  • 針對存儲屬性和類屬性的變化
  • 怎么實現(xiàn)?為觀察的屬性添加觀察器
    willSet 在賦新值之前調(diào)用篷帅,使用內(nèi)置變量newValue
    didSet 賦新值之后調(diào)用,使用oldValue

class Student{
//存儲屬性
var age:Int = 0
var javaScore:Double = 0.0
var htmlScore:Double = 0.0
//屬性觀察器
var name:String = "test"{
willSet{
print("willSet被調(diào)用,newValue的值(a)")
}
didSet{
print("didSet被調(diào)用,oldValue的值(b)")
}
var m1 = Machine()
m1.current = 20
m1.current = 30
m1.current = 100
print(m1.current)
}
var stu = Student()
stu.name = "miao"
stu.name = "123"

不同使用場景剖析

懶加載屬性使用場景

1):位置的定位

class Location{
let latitude:Double //經(jīng)度
let longitude:Double //緯度
init(latitude:Double,longitude:Double){
self.latitude = latitude
self.longitude = longitude
}
lazy var address:String = {
//進行經(jīng)緯度分析,復(fù)雜的計算
return "xxxx"
}()
}

2):閱讀類APP
問題:書本的內(nèi)容到底時候加載到內(nèi)存里拴泌?
在訪問列表頁:書名魏身、封面、簡介蚪腐,不需要加載書本的內(nèi)容
在詳情頁箭昵,只有用戶點擊閱讀,加載內(nèi)容到內(nèi)存里回季。
class Book{
let name:String = ""
lazy var content:String = {
//從網(wǎng)絡(luò)讀取
return "xx"
}()
}

屬性觀察器使用場景

有一個設(shè)備家制,對通電的最大電流值有要求,最高30泡一。
要求對current屬性重新設(shè)計颤殴,滿足如下:

  1. < 30, 提示正常賦值
    2)= 30,提醒你已經(jīng)到最大值
    3)>30 ,提醒用戶鼻忠,當前電流太高涵但,此次賦值失敗,回到原始值帖蔓。
    class Machine{
    let max = 30 //允許通過的最大電流
    var current = 10 {
    willSet{
    if newValue < max{
    print("正常賦值")
    }
    if newValue == max{
    print("注意矮瘟!當前電流已經(jīng)到達最大值")
    }
    }
    didSet{
    if current > max{
    print("注意!當前電流已經(jīng)超過最大值30塑娇,回滾到原來的值")
    current = oldValue
    }
    }
    }
    }
    var m1 = Machine()
    m1.current = 20
    m1.current = 30
    m1.current = 100
    print(m1.current)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澈侠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子埋酬,更是在濱河造成了極大的恐慌哨啃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奇瘦,死亡現(xiàn)場離奇詭異棘催,居然都是意外死亡,警方通過查閱死者的電腦和手機耳标,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門醇坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事呼猪』” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵宋距,是天一觀的道長轴踱。 經(jīng)常有香客問我,道長谚赎,這世上最難降的妖魔是什么淫僻? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮壶唤,結(jié)果婚禮上雳灵,老公的妹妹穿的比我還像新娘。我一直安慰自己闸盔,他們只是感情好悯辙,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迎吵,像睡著了一般躲撰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上击费,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天拢蛋,我揣著相機與錄音,去河邊找鬼荡灾。 笑死瓤狐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的批幌。 我是一名探鬼主播础锐,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荧缘!你這毒婦竟也來了皆警?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤截粗,失蹤者是張志新(化名)和其女友劉穎信姓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绸罗,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡意推,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了珊蟀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菊值。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腻窒,到底是詐尸還是另有隱情昵宇,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布儿子,位于F島的核電站瓦哎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柔逼。R本人自食惡果不足惜蒋譬,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愉适。 院中可真熱鬧羡铲,春花似錦、人聲如沸儡毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腰湾。三九已至,卻和暖如春疆股,著一層夾襖步出監(jiān)牢的瞬間费坊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工旬痹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留附井,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓两残,卻偏偏與公主長得像永毅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子人弓,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔沼死,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,762評論 2 9
  • 1.類屬性用static修飾2.類屬性是和類關(guān)聯(lián)的崔赌,而不是單獨屬于某個對象3.只能通過類名來訪問意蛀,這點和java不...
    容顏丿莫摧殘閱讀 300評論 0 0
  • 存儲屬性1.存儲常量或者變量的2.要么給它默認值,要么在構(gòu)造方法里初始化 計算屬性 計算屬性不直接存儲值2.訪問時...
    筠悅閱讀 211評論 0 0
  • 2014年的蘋果全球開發(fā)者大會(WWDC)健芭,當Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,294評論 0 9
  • 屬性 屬性將值與特定的類县钥、結(jié)構(gòu)體或枚舉關(guān)聯(lián) 存儲屬性 1.存儲常量或者變量的2.要么給它默認值,要么在構(gòu)造方法里初...
    迷兔兔_閱讀 80評論 0 0