屬性

存儲(chǔ)屬性
其實(shí)Swift中的存儲(chǔ)屬性就是以前學(xué)習(xí)OC中的普通屬性, 在結(jié)構(gòu)體或者類中定義的屬性, 默認(rèn)就是存儲(chǔ)屬性
*/

struct Person {
var name: String
var age: Int
}
var p:Person = Person(name: "lnj", age: 30)
p.name = "hm"
p.age = 50

/*
常量存儲(chǔ)屬性
常量存儲(chǔ)屬性只能在定義時(shí)或構(gòu)造時(shí)修改, 構(gòu)造好一個(gè)對(duì)象之后不能對(duì)常量存儲(chǔ)屬性進(jìn)行修改
*/

struct Person2 {
var name: String
var age: Int
let card: String // 身份證
}
var p2: Person2 = Person2(name: "lnj", age: 30, card: "123456")
p2.name = "hm"
p2.age = 50
// 構(gòu)造好對(duì)象之后不能修改常量存儲(chǔ)屬性
//p2.card = "56789"

/*
結(jié)構(gòu)體和類常量與存儲(chǔ)屬性的關(guān)系
結(jié)構(gòu)體和枚舉是值類型
類是引用類型
*/

struct Person3 {
var name: String
var age: Int
}
let p3: Person3 = Person3(name: "lnj", age: 30)
// 因?yàn)榻Y(jié)構(gòu)體是值類型, 所以不能修改結(jié)構(gòu)體常量中的屬性
// 不能修改結(jié)構(gòu)體/枚舉常量對(duì)象中的值, 因?yàn)樗赶虻膶?duì)象是一個(gè)常量
//p3.name = "hm"
// 不能修改結(jié)構(gòu)體常量對(duì)象的值
//p3 = Person(name: "hm", age: 50)

class Person4 {
var name: String = "lnj"
var age: Int = 30
}
let p4:Person4 = Person4()
// 可以修改類常量中的值, 因?yàn)樗赶虻膶?duì)象不是一個(gè)常量
p4.name = "hm"
// 不可以修改類常量的指向
//p4 = Person4()

/*
延遲存儲(chǔ)屬性
Swift語(yǔ)言中所有的存儲(chǔ)屬性必須有初始值, 也就是當(dāng)構(gòu)造完一個(gè)對(duì)象后, 對(duì)象中所有的存儲(chǔ)屬性必須有初始值, 但是也有例外, 其中延遲存儲(chǔ)屬性可以將屬性的初始化推遲到該屬性第一次被調(diào)用的時(shí)候
懶加載應(yīng)用場(chǎng)景:
1.有可能不會(huì)用到
2.依賴于其它值
*/

class Line {
var start:Double = 0.0
var end: Double = 0.0
// 如果不是lazy屬性, 定義的時(shí)候?qū)ο筮€沒(méi)有初始化, 所以不能訪問(wèn)self
// 如果加上lazy, 代表使用時(shí)才會(huì)加載, 也就是使用到length屬性時(shí)才會(huì)調(diào)用self,
// 而訪問(wèn)一個(gè)類的屬性必須通過(guò)對(duì)象方法, 所以訪問(wèn)時(shí)對(duì)象已經(jīng)初始化完成了, 可以使用self
lazy var length: Double = self.getLenght()
// 通過(guò)閉包懶加載
lazy var container: Array<AnyObject> = {
print("懶加載")
// return self.end - self.start
var arrM = []
return arrM as [AnyObject]
}()
func getLenght() ->Double
{
print("懶加載")
return end - start
}
}
var line = Line()
line.end = 150.0
//print(line.getLenght())
print("創(chuàng)建對(duì)象完畢")
print(line.length)
var arrM = line.container
arrM.append("1")
arrM.append(5)
print(arrM)

/*
計(jì)算屬性
1.Swift中的計(jì)算屬性不直接存儲(chǔ)值, 跟存儲(chǔ)屬性不同, 沒(méi)有任何的"后端存儲(chǔ)與之對(duì)應(yīng)"
2.計(jì)算屬性用于計(jì)算, 可以實(shí)現(xiàn)setter和getter這兩種計(jì)算方法
3.枚舉不可以有存儲(chǔ)屬性, 但是允許有計(jì)算屬性
setter 對(duì)象.屬性 = 值
getter var value = 對(duì)象.屬性
*/

struct Rect {
var origion: (x: Double, y: Double) = (0, 0)
var size: (w: Double, h: Double) = (0, 0)
// 由于center的值是通過(guò)起點(diǎn)和寬高計(jì)算出來(lái)的, 所以沒(méi)有必要提供一個(gè)存儲(chǔ)屬性
// var center: (x: Double, y: Double) = (0, 0)
var center: (x: Double, y: Double) {
get{
// print("get")
return (origion.x + size.w/2, origion.y + size.h/2)
}
// set(newCenter){
set{
// print("set (newCenter)")
// 注意: 計(jì)算屬性不具備存儲(chǔ)功能, 所以不能給計(jì)算屬性賦值, 如果賦值會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤
// 注意: setter可以自己傳遞一個(gè)參數(shù), 也可以使用系統(tǒng)默認(rèn)的參數(shù)newValue
// 如果要使用系統(tǒng)自帶的參數(shù), 必須刪除自定義參數(shù)
// origion.x = newCenter.x - size.w / 2
// origion.y = newCenter.y - size.h / 2
origion.x = newValue.x - size.w / 2
origion.y = newValue.y - size.h / 2
}
}
}
var r = Rect()
r.origion = (0, 0)
r.size = (100, 100)
//r.center = ((r.origion.x + r.size.w) / 2, (r.origion.y + r.size.h) / 2)
print("center.x = (r.center.x) center.y = (r.center.y)")
r.center = (100, 100)
print("origion.x = (r.origion.x) origion.y = (r.origion.y)")
print("center.x = (r.center.x) center.y = (r.center.y)")

/*
只讀計(jì)算屬性
對(duì)應(yīng)OC中的readonly屬性, 所謂的只讀屬性就是只提供了getter方法, 沒(méi)有提供setter方法
*/

class Line2 {
var start:Double = 0.0
var end: Double = 0.0
// 只讀屬性, 只讀屬性必須是變量var, 不能是常量let
// 例如想獲取長(zhǎng)度, 只能通過(guò)計(jì)算獲得, 而不需要外界設(shè)置, 可以設(shè)置為只讀計(jì)算屬性
var length: Double{
// 只讀屬性的簡(jiǎn)寫(xiě), 可以省略get{}
// get{
return end - start
// }
}
}

var line2 = Line2()
line2.end = 100
print(line2.length)

/*
屬性觀察器,類似OC中的KVO, 可以用于監(jiān)聽(tīng)屬性什么時(shí)候被修改, 只有屬性被修改才會(huì)調(diào)用
有兩種屬性觀察器:
1.willSet, 在設(shè)置新值之前調(diào)用
2.didSet, 在設(shè)置新值之后調(diào)用
可以直接為除計(jì)算屬性和lazy屬性之外的存儲(chǔ)屬性添加屬性觀察器, 但是可以在繼承類中為父類的計(jì)算屬性提供屬性觀察器
因?yàn)樵谟?jì)算屬性中也可以監(jiān)聽(tīng)到屬性的改變, 所以給計(jì)算屬性添加屬性觀察器沒(méi)有任何意義
*/
class Line3 {
var start:Double = 0.0{
willSet{
print("willSet newValue = (newValue)")
}
didSet{
print("didSet oldValue = (oldValue)")
}
}
var end: Double = 0.0
}
var l = Line3()
l.start = 10.0

/*
類屬性
在結(jié)構(gòu)體和枚舉中用static
在類中使用class, 并且類中不允許將存儲(chǔ)屬性設(shè)置為類屬性
*/

struct Person5 {
// 普通的屬性是每個(gè)對(duì)象一份
var name: String = "lnj"
// 類屬性是素有對(duì)象共用一份
static var gender:String = "man"
static var age:Int{
return 30
}
func show()
{
print("gender = (Person5.gender) name = (name)")
}
}
var p5 = Person5()
//print("gender = (p.gender)")
print("gender = (Person5.gender)")
var p6 = Person5()
// 類屬性是所有對(duì)象共用一份
print("gender = (Person5.gender)")
p5.show()
// 可以將計(jì)算屬性設(shè)置為類屬性
print("age = (Person5.age)")

class Person6 {
// 普通的屬性是每個(gè)對(duì)象一份
var name: String = "lnj"
// 類中不允許將存儲(chǔ)屬性定義為類屬性
// class var gender:String = "man"
// 類中只能將計(jì)算屬性定義為類屬性
class var age:Int{
return 30
}
func show()
{
print("age = (Person6.age)")
}
}
var p7 = Person6()
print("age = (Person6.age)")
p7.show()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市职恳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖痰洒,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件害晦,死亡現(xiàn)場(chǎng)離奇詭異螃宙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浴井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霉撵,“玉大人磺浙,你說(shuō)我怎么就攤上這事⊥狡拢” “怎么了撕氧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)喇完。 經(jīng)常有香客問(wèn)我伦泥,道長(zhǎng),這世上最難降的妖魔是什么锦溪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任不脯,我火速辦了婚禮,結(jié)果婚禮上刻诊,老公的妹妹穿的比我還像新娘防楷。我一直安慰自己,他們只是感情好则涯,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布复局。 她就那樣靜靜地躺著冲簿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亿昏。 梳的紋絲不亂的頭發(fā)上峦剔,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音龙优,去河邊找鬼羊异。 笑死,一個(gè)胖子當(dāng)著我的面吹牛彤断,可吹牛的內(nèi)容都是我干的野舶。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宰衙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼平道!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起供炼,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤一屋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袋哼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冀墨,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年涛贯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诽嘉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弟翘,死狀恐怖虫腋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稀余,我是刑警寧澤悦冀,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站睛琳,受9級(jí)特大地震影響盒蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜师骗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一茁影、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丧凤,春花似錦募闲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)靴患。三九已至,卻和暖如春要出,著一層夾襖步出監(jiān)牢的瞬間鸳君,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工患蹂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留或颊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓传于,卻偏偏與公主長(zhǎng)得像囱挑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沼溜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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