Structures 結(jié)構(gòu)體類(lèi)型可以存儲(chǔ)屬性、方法,以及定義自己的偏好行為。能夠使用任意合法的類(lèi)型如 String、Int or Array...,或者自定義的類(lèi)型。
基礎(chǔ)語(yǔ)法
- 創(chuàng)建結(jié)構(gòu)體
/*
struct <name> { ... }
*/
struct Location {
let x: Int
let y: Int
}
在 Location 中,成員 x、y 被稱(chēng)為屬性 properties。屬性可以是 變量 或者 常量,每一個(gè)結(jié)構(gòu)體類(lèi)型實(shí)例 instance 都會(huì)擁有這些屬性。
你可以生成一個(gè)實(shí)例,并像其他類(lèi)型一樣把它存儲(chǔ)到一個(gè)常量或變量中。
//初始化 initializer
let storeLocation = Location(x: 2, y: 4)
在使用實(shí)例之前,系統(tǒng)強(qiáng)制要求必須初始化所有屬性,并且這是Swift的一個(gè)安全特性。另一個(gè)特性是,你不需要為L(zhǎng)ocation 類(lèi)型聲明一個(gè)構(gòu)造函數(shù)。Swift 會(huì)自動(dòng)提供構(gòu)造函數(shù),默認(rèn)參數(shù)列表包含所有屬性。
結(jié)構(gòu)體類(lèi)型作為屬性
struct DeliverArea {
let center: Location
var radius: Double
}
var storeArea = DeliveryArea(center: storeLocation, radius: 4)
- 訪問(wèn)結(jié)構(gòu)體類(lèi)型成員
同Strings、Arrays...一樣,我們可以使用點(diǎn)語(yǔ)法訪問(wèn)成員。
print(storeArea.radius) //4.0
//連續(xù)的點(diǎn)語(yǔ)法形式
print(storeArea.center.x) //2
//當(dāng)然我們也可以修改其中的成員變量,因?yàn)閞adius 被聲明為 var
storeArea.radius = 200
/*
注意?。?!
嘗試修改center 是會(huì)報(bào)錯(cuò)的,因?yàn)槠浔宦暶鳛?let
*/
結(jié)構(gòu)體是值類(lèi)型 value type
在 Swift 中 值 的概念對(duì) 結(jié)構(gòu)體 具有很大的意義,因?yàn)?結(jié)構(gòu)體 被稱(chēng)為值類(lèi)型。一個(gè)相對(duì)的概念就是 引用類(lèi)型,典型代表就是 類(lèi)。其中異同,跟內(nèi)存管理相關(guān)。
/*
Sturctures -> value types
一個(gè)值類(lèi)型最大的特點(diǎn)就是,在實(shí)例賦值時(shí)是會(huì)發(fā)生拷貝的。
專(zhuān)業(yè)名詞被稱(chēng)為:copy-on-assignment
*/
var varA = 10
var varB = varA
print(varA) // 10
print(varB) // 10
varA = 7
print(varA) // 7
print(varB) // 5
這個(gè)簡(jiǎn)單的規(guī)則,同樣適用于結(jié)構(gòu)體。
var area1 = DeliveryArea(center: Location(x: 2, y: 4), radius: 2.5)
var area2 = area1
print(area1.radius) // 2.5
print(area2.radius) // 2.5
area1.radius = 4
print(area1.radius) // 4.0
print(area2.radius) // 2.5
/*
從上面的結(jié)果來(lái)看,area1、area2是完全獨(dú)立的。
不要想復(fù)雜了,不要糾結(jié)深、淺拷貝云云。
*/
小結(jié):結(jié)構(gòu)在Swift的應(yīng)用是無(wú)處不在的,感興趣的可以看下系統(tǒng)庫(kù)Int的定義,你就可以看到如下驚喜:
public struct Int : FixedWidthInteger, SignedInteger {
// ...
}
/*
FixedWidthInteger, SignedInteger 是協(xié)議 protocol
遵循協(xié)議的語(yǔ)法是在類(lèi)型名后 (雙引號(hào)): (協(xié)議名)
public 是權(quán)限控制關(guān)鍵字,這里表示開(kāi)放權(quán)限。
*/
//這里介紹一個(gè)典型的協(xié)議 CustomStringConvertible
public protocol CustomStringConvertible {
/// A textual representation of this instance.
public var description: String { get }
}
/*
通過(guò)上述協(xié)議,我們可以簡(jiǎn)單的為各種實(shí)例提供一個(gè)描述方法。
OC下具有同樣的方法,系統(tǒng)的類(lèi)已經(jīng)實(shí)現(xiàn)了該方法。
print(instance) 方法觸發(fā)
*/
類(lèi)似的,Double、String、Bool、Array、Dictionary 都是被定義為結(jié)構(gòu)體類(lèi)型的。正如之前所說(shuō),Swift是基于協(xié)議來(lái)構(gòu)建的。所以上面的例子你也會(huì)發(fā)現(xiàn),結(jié)構(gòu)體和協(xié)議的結(jié)合已經(jīng)是一種很常見(jiàn)的范式。