1. 基本概念
- 結(jié)構(gòu)體是用于封裝不同或相同類(lèi)型的數(shù)據(jù)的
- Swift中的結(jié)構(gòu)體是一類(lèi)類(lèi)型, 可以定義屬性和方法(甚至構(gòu)造方法和析構(gòu)方法等)
- 格式:
struct 結(jié)構(gòu)體名稱(chēng) {
結(jié)構(gòu)體屬性和方法
}
struct Rect {
var width:Double = 0.0
var height:Double = 0.0
}
- 如果結(jié)構(gòu)體的屬性有默認(rèn)值, 可以直接使用()構(gòu)造一個(gè)結(jié)構(gòu)體
- 如果結(jié)構(gòu)體的屬性沒(méi)有默認(rèn)值, 必須使用逐一構(gòu)造器實(shí)例化結(jié)構(gòu)體
var r = Rect()
print("width = \(r.width) height = \(r.height)")
//輸出結(jié)果: width = 0.0 height = 0.0
- 結(jié)構(gòu)體屬性的訪(fǎng)問(wèn)使用點(diǎn)
.
語(yǔ)法
var r1 = Rect()
r1.width = 100
r1.height = 99
print("width = \(r1.width) height = \(r1.height)")
//輸出結(jié)果: width = 100.0 height = 99.0
2. 結(jié)構(gòu)體構(gòu)造器
- Swift中的結(jié)構(gòu)體和類(lèi)跟其它面向?qū)ο笳Z(yǔ)言一樣都有構(gòu)造函數(shù), 而OC是沒(méi)有的
- Swift要求實(shí)例化一個(gè)結(jié)構(gòu)體或類(lèi)的時(shí)候,所有的成員變量都必須有初始值,
- 構(gòu)造函數(shù)的意義就是用于初始化所有成員變量的, 而不是分配內(nèi)存, 分配內(nèi)存是系統(tǒng)幫我們做的.
- 如果結(jié)構(gòu)體中的所有屬性都有默認(rèn)值, 可以調(diào)用
()
構(gòu)造一個(gè)結(jié)構(gòu)體實(shí)例
- 如果結(jié)構(gòu)體中的屬性沒(méi)有默認(rèn)值, 可以自定義構(gòu)造器, 并在構(gòu)造器中給所有的屬性賦值
- 其實(shí)結(jié)構(gòu)體有一個(gè)默認(rèn)的逐一構(gòu)造器, 用于在初始化時(shí)給所有屬性賦值
struct Rect2 {
var width:Double
var height:Double = 0.0
}
//逐一構(gòu)造器
var r2 = Rect2(width: 10.0, height: 10.0);
//錯(cuò)誤寫(xiě)法, 順序必須和結(jié)構(gòu)體中成員的順序一致
var r2 = Rect2(height: 10.0, width: 10.0);
//錯(cuò)誤寫(xiě)法, 必須包含所有成員
var r2 = Rect2(height: 10.0);
3. 結(jié)構(gòu)體中定義成員方法
- 在C和OC中結(jié)構(gòu)體只有屬性, 而Swift中結(jié)構(gòu)體中還可以定義方法
- 給結(jié)構(gòu)體定義一個(gè)方法, 該方法屬于該結(jié)構(gòu)體
- 結(jié)構(gòu)體中的成員方法必須使用某個(gè)實(shí)例調(diào)用
- 成員方法可以訪(fǎng)問(wèn)成員屬性
- 結(jié)構(gòu)體中的成員方法是和某個(gè)實(shí)例對(duì)象綁定在一起的,
- 所以誰(shuí)調(diào)用, 方法中訪(fǎng)問(wèn)的屬性就屬于誰(shuí)
struct Rect3 {
var width:Double
var height:Double = 0.0
func getWidth() -> Double{
return width
}
}
var r3 = Rect3(width: 10.0, height: 20.0)
print(r3.getWidth())
//輸出結(jié)果: 10.0
var r4 = Rect3(width: 30.0, height: 20.0)
print(r4.getWidth())
//輸出結(jié)果: 30.0
4. 結(jié)構(gòu)體是值類(lèi)型
- 結(jié)構(gòu)體是值類(lèi)型, 結(jié)構(gòu)體之間的賦值其實(shí)是將r1中的值完全拷貝一份到r2中,
- 所以他們是兩個(gè)不同的實(shí)例
struct Rect4 {
var width:Double
var height:Double = 0.0
func show() -> Void{
print("width = \(width) height = \(height)")
}
}
var r5 = Rect4(width: 10.0, height: 10.0)
var r6 = r5
r5.show()
r6.show()
r5.width = 20.0
r5.show()
r6.show()
//輸出結(jié)果:
//width = 10.0 height = 10.0
//width = 10.0 height = 10.0
//width = 20.0 height = 10.0
//width = 10.0 height = 10.0
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者