Swift-屬性

/*
儲存屬性
儲存常量或變量的
要么給他默認(rèn)值,要么在構(gòu)造方法里初始化
/
/

計(jì)算屬性
計(jì)算屬性不可直接儲存值
訪問的時(shí)候調(diào)用get,賦值調(diào)用set
get里一定要有return
set中有一個(gè)內(nèi)置的newValue變量,用于接收外界賦值的新值
set里不能給當(dāng)前的計(jì)算屬性賦值,否則死循環(huán)
只讀計(jì)算屬性:只提供get,沒有set,在寫的時(shí)候可以省略get{}
/
/

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

能通過類名來訪問
*/
class Student{
//儲存屬性
var age:Int=0
var javaScore:Double=0.0
var htmiScore:Double=0.0

//計(jì)算屬性
var averageScore:Double{
    //獲取值
    訪問的時(shí)候調(diào)用
    get{
     print("get被調(diào)用")
     return(javaScore*htmiScore)/2//get中一定要有return語句
    }
    //賦值
    set{
        print("set被調(diào)用,\(newValue)")
        //self.averageScore=newValue 不要給set里計(jì)算屬性,否則死循環(huán)
    }
}
//只讀計(jì)算屬性
var averageScore2:Double{
    //獲取值
    get{
        print("get被調(diào)用")
        return(javaScore+htmiScore)/2
    }
}
//只讀計(jì)算屬性-省略get{}
var averageScore3:Double{
    //獲取值
    print("get被調(diào)用")
    return(javaScore+htmiScore)/2
}
//類屬性
static var courseCount:Int=2

}
var stu = Student()
//使用儲存屬性
stu.age = 19
stu.javaScore = 89
stu.htmiScore = 78

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

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

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

/*
懶加載屬性(懶屬性)
懶加載屬性的引入
需求:需要對區(qū)間進(jìn)行計(jì)算,假設(shè)該計(jì)算計(jì)算量很大,很耗時(shí),把最終計(jì)算結(jié)果放到result變量中
*/
class CloseRange{
var start:Int = 0
var end:Int = 100
//方案二:result設(shè)計(jì)為計(jì)算屬性
var result:Int{
get{
print("開始計(jì)算...")
var res = 0
//此時(shí)采用要求和操作來模擬進(jìn)行大量計(jì)算
for i in self.start...self.end{
res+=i
}
result res

    }()
}
var range = CloseRange()
print(range.result)
print(range.result)
print(range.result)
print(range.result)

/*
屬性觀察器
監(jiān)聽和響應(yīng)屬性值的變化
針對存儲屬性和類屬性的變化
怎么實(shí)現(xiàn)?為觀察的屬性添加觀察器
willSet 在賦新值之前調(diào)用,使用內(nèi)置變量newValue
didSet 賦新值之后調(diào)用,使用oldValue
*/
class Student{
//儲存屬性
var age:Int = 0
var javaScore:Double = 0.0
var htmiScore:Double = 0.0

//屬性觀察器
var name:String = "test"{
    willSet{
        print("willSet被調(diào)用,newValue的值\(a)")
    }
    didSet{
        print("didSet被調(diào)用,oldValue的值\(b)")
    }
}

}
var stu = Student()
stu.name = "zhang"
stu.name = "ann"

/*
不同的使用場景剖析
懶加載屬性使用場景
*/
//場景一:位置的定位
class Location{
let latitude:Double//經(jīng)度
let longitude:Double//緯度
init(latitude:Double,longitude:Double){
self.latitude = latitude
self.longitude = longitude
}
lazy var adress:String = {
//進(jìn)行經(jīng)緯度分析,復(fù)雜的運(yùn)算
return "xxxxx"
}()
}

//場景二:閱讀類APP
// 問題:書本的內(nèi)容到底時(shí)候加載到內(nèi)存里?
// 在訪問列表頁:書名、封面、簡介,不需要加載書本的內(nèi)容
// 在詳情頁,只有用戶點(diǎn)擊閱讀,加載內(nèi)容到內(nèi)存里
class Book{
let name:String=""
lazy var content:String = {
//從網(wǎng)絡(luò)讀取
return "xx"
}()
}
/*
屬性觀察器使用場景
有一個(gè)設(shè)備,對通電的最大電流值有要求,最高30。
要求對current屬性重新設(shè)計(jì),滿足如下:
< 30, 提示正常賦值
2)= 30,提醒你已經(jīng)到最大值
3)>30 ,提醒用戶,當(dāng)前電流太高,此次賦值失敗,回到原始值。
*/
class Machine{
let max = 30//允許通過最大電流
var current = 10{
willSet{
if newValue < max{
print("正常賦值")
}
if newValue == max{
print("注意!當(dāng)前電流已經(jīng)達(dá)到最大值")
}
}
didSet{
if current > max{
print("注意!當(dāng)前電流已經(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 1.類屬性用static修飾2.類屬性是和類關(guān)聯(lián)的,而不是單獨(dú)屬于某個(gè)對象3.只能通過類名來訪問,這點(diǎn)和java不...
    容顏丿莫摧殘閱讀 316評論 0 0
  • swift中屬性有多種功能 存儲功能:存儲實(shí)例的常量和變量 計(jì)算功能:通過某種方式計(jì)算出來的屬性 類屬性: 與整個(gè)...
    清風(fēng)沐沐閱讀 589評論 0 0
  • 存儲屬性 存儲常量或者變量的 要么給它默認(rèn)值,要么在構(gòu)造方法里初始化 計(jì)算屬性 計(jì)算屬性不直接存儲值 訪問時(shí)候調(diào)用...
    吐個(gè)泡泡_e9f0閱讀 169評論 0 0
  • Swift 屬性將值跟特定的類、結(jié)構(gòu)或枚舉關(guān)聯(lián)。屬性可分為存儲屬性和計(jì)算屬性: 存儲屬性 簡單來說,一個(gè)存儲屬性就...
    郭小C_閱讀 263評論 0 0
  • 存儲屬性 1.存儲常量或者變量的 2.要么給它默認(rèn)值,要么在構(gòu)造方法里初始化 計(jì)算屬性 1.計(jì)算屬性不直接存儲值 ...
    d98f0f4389bf閱讀 601評論 0 0

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