結(jié)構(gòu)體的介紹
1:結(jié)構(gòu)體(struct)是由一系列具有相同類型或不同類
型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合;
2:結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu);
3:結(jié)構(gòu)體是值類型,在方法中傳遞時是值拷貝;
結(jié)構(gòu)體和枚舉都是值類型:值類型被賦予給一個變量、常量或者被傳遞
給一個函數(shù)的時候,其值會被拷貝,所以將結(jié)構(gòu)體的實例對象A復(fù)制給實
例對象B,這個時候更改實例對象B屬性的值,實例對象A不會收到影響;
格式
struct 結(jié)構(gòu)體名稱 {
// 屬性和方法
}
結(jié)構(gòu)體的使用
struct SomeStructure {
var width = 0
var heigth = 0
}
1:結(jié)構(gòu)體會自動提供一個初始化器
如:
let hahah = SomeStructure(height: <#T##Int#>, width: <#T##Int#>)
2:所有的結(jié)構(gòu)體和枚舉都是值類型。這意味著它們
的實例,以及實例中所包含的任何值類型屬性,在
代碼中傳遞的時候都會被復(fù)制
let hd = SomeStructure(width: 1920, height: 1080)
var cinema = hd
解釋:
聲明了一個名為cinema的變量,其值為之前聲明
的hd。因為SomeStructure是一個結(jié)構(gòu)體,所以cinema
的值其實是hd的一個拷貝副本,而不是hd本身。
盡管hd和cinema有著相同的寬(width)和高(height)
屬性,但是在后臺中,它們是兩個完全不同的實例;
結(jié)構(gòu)體定義構(gòu)造方法
注意點
1:擴充的構(gòu)造函數(shù)會覆蓋之前的構(gòu)造函數(shù)(也就是
說,自己定義了構(gòu)造函數(shù)那么系統(tǒng)提供的構(gòu)造函數(shù)
就被覆蓋了);
2:擴充的構(gòu)造函數(shù)中必須保證成員變量是有值的;
例子
struct Location {
var x : Double
var y : Double
init(x : Double, y : Double) {
self.x = x
self.y = y
}
init(xyString : String) {
let strs = xyString.components(separatedBy: ",")
x = Double(strs.first!)!
y = Double(strs.last!)!
}
}
let location = Location(x: 100, y: 100)
let location1 = Location(xyString: "100,100")
注意點
1:在給結(jié)構(gòu)體或者枚舉擴充方法時,若是方法里面需
要用到本身的成員變量,那么就要在方法前面加上
mutating關(guān)鍵字;因為結(jié)構(gòu)體和枚舉是值類型。默認(rèn)情況下,值類型的
屬性不能在它的實例方法中被修改。但是,如果你確實需要在某個特定
的方法中修改結(jié)構(gòu)體或者枚舉的屬性,你可以為這個方法選擇 可變
(mutating) 行為,然后就可以從其方法內(nèi)部改變它的屬性;并且這個方法
做的任何改變都會在方法執(zhí)行結(jié)束時寫回到原始 結(jié)構(gòu)中;