swift屬性

存儲(chǔ)屬性

存儲(chǔ)常量或者變量的

要么給它默認(rèn)值,要么在構(gòu)造方法里初始化

計(jì)算屬性

計(jì)算屬性不直接存儲(chǔ)值

訪問(wèn)時(shí)候調(diào)用get,賦值調(diào)用set,類似java里的封裝

get里一定要有return

set中有一個(gè)內(nèi)置的newValue變量,用于接收外界賦的新值

set里不能給當(dāng)前的計(jì)算屬性賦值,否則死循環(huán)

只讀計(jì)算屬性:只提供get,沒(méi)有set,在寫(xiě)的時(shí)候可以省略get{}

存儲(chǔ)屬性

存儲(chǔ)常量或者變量的

要么給它默認(rèn)值,要么在構(gòu)造方法里初始

類屬性

類屬性用static修飾

類屬性是和類關(guān)聯(lián)的,而不是單獨(dú)屬于某個(gè)對(duì)象

只能通過(guò)類名來(lái)訪問(wèn),這點(diǎn)和java不同

classStudent{//存儲(chǔ)屬性varage:Int =0varjavaScore:Double =0.0varhtmlScore:Double =0.0//計(jì)算屬性varaverageScore:Double {//獲取值get{print("get被調(diào)用")return(javaScore+htmlScore)/2//get中必須有return語(yǔ)句}//賦值set{print("set被調(diào)用,\(newValue)")//self.averageScore = newValue? 不要再set里給計(jì)算屬性賦值,否則死循環(huán)}? ? }//只讀計(jì)算屬性varaverageScore2:Double {//獲取值get{print("get被調(diào)用")return(javaScore+htmlScore)/2}? ? ? ? ? }//只讀計(jì)算屬性-省略get{}varaverageScore3:Double {//獲取值print("get被調(diào)用")return(javaScore+htmlScore)/2}//類屬性staticvarcourseCount:Int =2}varstu = Student()//使用存儲(chǔ)屬性stu.age =18stu.javaScore =90stu.htmlScore =60//使用計(jì)算屬性print(stu.averageScore)stu.averageScore =100//只讀計(jì)算屬性print(stu.averageScore2)print(stu.averageScore3)//使用類屬性print(stu.courseCount)//不能通過(guò)對(duì)象訪問(wèn)print(Student.courseCount)

懶加載屬性(懶屬性)

懶加載屬性的引入

需求:需要對(duì)區(qū)間進(jìn)行計(jì)算,假設(shè)該計(jì)算計(jì)算量很大,很耗時(shí),把最終計(jì)算結(jié)果放到result變量中

classCloseRange{varstart:Int =0varend:Int =1000//方案:result設(shè)計(jì)為計(jì)算屬性varresult:Int{? ? ? ? get{print("開(kāi)始計(jì)算...")varres =0//此時(shí)采用求和操作來(lái)模擬進(jìn)行大量計(jì)算。fori inself.start...self.end{? ? ? ? ? ? ? ? res += i? ? ? ? ? ? }returnres? ? ? ? }? ? }varrange = CloseRange()print(range.result)print(range.result)print(range.result)print(range.result)

思考:把result屬性定義為計(jì)算屬性有沒(méi)有什么缺陷?

缺陷:每訪問(wèn)一次,就計(jì)算一次,計(jì)算結(jié)果沒(méi)法存儲(chǔ)下來(lái)。

改進(jìn):用的時(shí)候,才會(huì)計(jì)算,計(jì)算1次,并且能把計(jì)算結(jié)果保存下來(lái)。--》引入懶加載屬性來(lái)解決

懶加載的使用:

lazyvar變量:類型 = { 代碼段}()

只會(huì)賦值一次

只有在第一次使用的時(shí)候,才會(huì)執(zhí)行閉包,然后把閉包返回值賦值給屬性

用的時(shí)候,才會(huì)計(jì)算,計(jì)算1次,并且能把計(jì)算結(jié)果保存下來(lái)

classCloseRange{varstart:Int =0varend:Int =1000//方案:result設(shè)計(jì)為懶加載屬性lazyvarresult:Int = {? ? ? ? ? ? ()->Int? inprint("開(kāi)始計(jì)算...")varres =0//此時(shí)采用求和操作來(lái)模擬進(jìn)行大量計(jì)算。fori inself.start...self.end{? ? ? ? ? ? ? ? res += i? ? ? ? ? ? }returnres? ? }()}varrange = CloseRange()print(range.result)//只有第一次調(diào)用的時(shí)候執(zhí)行閉包,干活只干1次!print(range.result)print(range.result)print(range.result)

屬性觀察器

監(jiān)聽(tīng)和響應(yīng)屬性值的變化

針對(duì)存儲(chǔ)屬性和類屬性的變化

怎么實(shí)現(xiàn)?為觀察的屬性添加觀察器

willSet? 在賦新值之前調(diào)用,使用內(nèi)置變量newValue

didSet? ? 賦新值之后調(diào)用,使用oldValue

classStudent{//存儲(chǔ)屬性varage:Int =0varjavaScore:Double =0.0varhtmlScore:Double =0.0//屬性觀察器varname:String ="test"{? ? ? ? willSet{print("willSet被調(diào)用,newValue的值\(a)")? ? ? ? }? ? ? ? didSet{print("didSet被調(diào)用,oldValue的值\(b)")? ? ? ? }? ? }? ? }varstu = Student()stu.name ="miao"stu.name ="123"

不同使用場(chǎng)景剖析

懶加載屬性使用場(chǎng)景

場(chǎng)景一:位置的定位

classLocation{letlatitude:Double//經(jīng)度letlongitude:Double//緯度init(latitude:Double,longitude:Double){? ? ? ? self.latitude = latitude? ? ? ? self.longitude = longitude? ? }? ? lazyvaraddress:String= {//進(jìn)行經(jīng)緯度分析,復(fù)雜的計(jì)算return"xxxx"}()}

場(chǎng)景二:閱讀類APP

問(wèn)題:書(shū)本的內(nèi)容到底時(shí)候加載到內(nèi)存里?

在訪問(wèn)列表頁(yè):書(shū)名、封面、簡(jiǎn)介,不需要加載書(shū)本的內(nèi)容

在詳情頁(yè),只有用戶點(diǎn)擊閱讀,加載內(nèi)容到內(nèi)存里。

classBook{letname:String=""lazyvarcontent:String= {//從網(wǎng)絡(luò)讀取return"xx"}()}

屬性觀察器使用場(chǎng)景

有一個(gè)設(shè)備,對(duì)通電的最大電流值有要求,最高30。

要求對(duì)current屬性重新設(shè)計(jì),滿足如下:

< 30, 提示正常賦值

2)= 30,提醒你已經(jīng)到最大值

3)>30 ,提醒用戶,當(dāng)前電流太高,此次賦值失敗,回到原始值。

classMachine{? ? let max =30//允許通過(guò)的最大電流varcurrent =10{? ? ? ? willSet{ifnewValue < max{print("正常賦值")? ? ? ? ? ? }ifnewValue == max{print("注意!當(dāng)前電流已經(jīng)到達(dá)最大值")? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? }? ? ? ? didSet{ifcurrent > max{print("注意!當(dāng)前電流已經(jīng)超過(guò)最大值30,回滾到原來(lái)的值")? ? ? ? ? ? ? ? current = oldValue? ? ? ? ? ? }? ? ? ? }? ? }}varm1 = Machine()m1.current =20m1.current =30m1.current =100print(m1.current)

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫(xiě)文章,發(fā)現(xiàn)簡(jiǎn)書(shū)還為我保存起的...
    Jenaral閱讀 3,160評(píng)論 2 9
  • 1.類屬性用static修飾2.類屬性是和類關(guān)聯(lián)的,而不是單獨(dú)屬于某個(gè)對(duì)象3.只能通過(guò)類名來(lái)訪問(wèn),這點(diǎn)和java不...
    容顏丿莫摧殘閱讀 316評(píng)論 0 0
  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,433評(píng)論 1 6
  • swift中屬性有多種功能 存儲(chǔ)功能:存儲(chǔ)實(shí)例的常量和變量 計(jì)算功能:通過(guò)某種方式計(jì)算出來(lái)的屬性 類屬性: 與整個(gè)...
    清風(fēng)沐沐閱讀 589評(píng)論 0 0
  • Swift 屬性將值跟特定的類、結(jié)構(gòu)或枚舉關(guān)聯(lián)。 屬性可分為存儲(chǔ)屬性和計(jì)算屬性: 存儲(chǔ)屬性 計(jì)算屬性 存儲(chǔ)常量或變...
    零度_不結(jié)冰閱讀 465評(píng)論 0 0

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