Switf4 Structures

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)的范式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,202評(píng)論 1 10
  • Swift語(yǔ)法基礎(chǔ)(五)-- (類(lèi)和結(jié)構(gòu)體、屬性、方法) 本章將會(huì)介紹 類(lèi)和結(jié)構(gòu)體對(duì)比結(jié)構(gòu)體和枚舉是值類(lèi)型類(lèi)是引用...
    寒橋閱讀 1,185評(píng)論 0 1
  • Swift 介紹 簡(jiǎn)介 Swift 語(yǔ)言由蘋(píng)果公司在 2014 年推出,用來(lái)撰寫(xiě) OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,445評(píng)論 3 25
  • 二、天門(mén)山探險(xiǎn) 張家界的行程8月25日正式開(kāi)啟。 是日,晨八時(shí)從長(zhǎng)沙出發(fā),乘大巴往張家界。 車(chē)行至五一大道,導(dǎo)游介...
    鐵嫵閱讀 919評(píng)論 69 35
  • 佳育國(guó)際教育學(xué)校有著科學(xué)的教學(xué)體系,優(yōu)秀的教師團(tuán)隊(duì),教學(xué)內(nèi)容豐富多彩,針對(duì)不同的兒童年齡特點(diǎn),因材施教,寓教于樂(lè)。...
    Ika老師閱讀 347評(píng)論 0 0

友情鏈接更多精彩內(nèi)容