/*
儲存屬性
儲存常量或變量的
要么給他默認(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)