結(jié)構(gòu)體:
結(jié)構(gòu)體是用于封裝不同或相同類型的數(shù)據(jù)的, Swift中的結(jié)構(gòu)體是一類類型, 可以定義屬性和方法(甚至構(gòu)造方法和析構(gòu)方法等)
格式:
struct 結(jié)構(gòu)體名稱 {
結(jié)構(gòu)體屬性和方法
}
struct Rect {
var width:Double = 0.0
var height:Double = 0.0
}
// 如果結(jié)構(gòu)體的屬性有默認(rèn)值, 可以直接使用()構(gòu)造一個結(jié)構(gòu)體
// 如果結(jié)構(gòu)體的屬性沒有默認(rèn)值, 必須使用逐一構(gòu)造器實例化結(jié)構(gòu)體
var r = Rect()//Rect
print("width = \(r.width) height = \(r.height)")//"width = 0.0 height = 0.0\n"
// 結(jié)構(gòu)體屬性的訪問使用.語法
r.width = 100//Rect
r.height = 99//Rect
print("width = \(r.width) height = \(r.height)")//"width = 100.0 height = 99.0\n"
結(jié)構(gòu)體構(gòu)造器
Swift中的結(jié)構(gòu)體和類跟其它面向?qū)ο笳Z言一樣都有構(gòu)造函數(shù), 而OC是沒有的
Swift要求實例化一個結(jié)構(gòu)體或類的時候,所有的成員變量都必須有初始值, 構(gòu)造函數(shù)的意義就是用于初始化所有成員變量的, 而不是分配內(nèi)存, 分配內(nèi)存是系統(tǒng)幫我們做的.
如果結(jié)構(gòu)體中的所有屬性都有默認(rèn)值, 可以調(diào)用()構(gòu)造一個結(jié)構(gòu)體實例
如果結(jié)構(gòu)體中的屬性沒有默認(rèn)值, 可以自定義構(gòu)造器, 并在構(gòu)造器中給所有的屬性賦值
其實結(jié)構(gòu)體有一個默認(rèn)的逐一構(gòu)造器, 用于在初始化時給所有屬性賦值
struct Rect2 {
var width:Double
var height:Double = 0.0
}
// 逐一構(gòu)造器
var r1 = Rect2(width: 10.0, height: 10.0);//Rect2
錯誤寫法:
// 錯誤寫法, 順序必須和結(jié)構(gòu)體中成員的順序一致
var r1 = Rect2(height: 10.0, width: 10.0); // error : Argument 'width' must precede argument 'height'
// 錯誤寫法, 必須包含所有成員
var r1 = Rect2(height: 10.0); // error : Missing argument for paremeter 'width' in call
結(jié)構(gòu)體中定義成員方法
在C和OC中結(jié)構(gòu)體只有屬性, 而Swift中結(jié)構(gòu)體中還可以定義方法
struct Rect3 {
var width:Double
var height:Double = 0.0
// 給結(jié)構(gòu)體定義一個方法, 該方法屬于該結(jié)構(gòu)體
// 結(jié)構(gòu)體中的成員方法必須使用某個實例調(diào)用
// 成員方法可以訪問成員屬性
func getWidth() -> Double{
return width
}
}
var r2 = Rect3(width: 10.0, height: 20.0)//Rect3
// 結(jié)構(gòu)體中的成員方法是和某個實例對象綁定在一起的, 所以誰調(diào)用, 方法中訪問的屬性就屬于誰
print(r2.getWidth())//"10.0\n"
var r3 = Rect3(width: 30.0, height: 20.0)//Rect3
// 取得r2這個對象的寬度
print(r3.getWidth())//"30.0\n"
- 結(jié)構(gòu)體是值類型
struct Rect4 {
var width:Double
var height:Double = 0.0
func show() -> Void{
print("width = \(width) height = \(height)")
}
}
var r4 = Rect4(width: 10.0, height: 10.0) //Rect4
var r5 = r4 //Rect4
賦值有兩種情況
1.指向同一塊存儲空間
2.兩個不同實例, 但內(nèi)容相同
結(jié)構(gòu)體是值類型, 結(jié)構(gòu)體之間的賦值其實是將r1中的值完全拷貝一份到r2中, 所以他們是兩個不同的實例
r4.show() //Rect4
r5.show() //Rect4
r4.width = 20.0 //Rect4
// 結(jié)構(gòu)體是值類型, 結(jié)構(gòu)體之間的賦值其實是將r1中的值完全拷貝一份到r2中, 所以他們是兩個不同的實例
print(r4.width) //"20.0\n"
print(r5.width) //"10.0\n"