Swift 結(jié)構(gòu)體 與 類

結(jié)構(gòu)體

一、結(jié)構(gòu)體 是值類型

二、結(jié)構(gòu)體的存儲(chǔ)位置

結(jié)構(gòu)體的存儲(chǔ)位置 根據(jù)不同情況來分
1、如果結(jié)構(gòu)體(值類型)在函數(shù)中創(chuàng)建 它存儲(chǔ)在??臻g
例如:

func testStruct(){
    struct Point {
        var x: Int = 0
        var y: Int = 0
    }
    var p = Point()
}

由于結(jié)構(gòu)體在  testStruct 函數(shù)中創(chuàng)建 所以他存儲(chǔ)在 棧空間

2、 如果值類型在全局區(qū)創(chuàng)建的 它存儲(chǔ)在代碼區(qū)
例如:

import Foundation

struct Point {
    var x: Int
    var y: Int
}

var p = Point.init(x: 10, y: 10)

三、說明 + 示例

在swift標(biāo)準(zhǔn)庫中。絕大數(shù)的公開類都是結(jié)構(gòu)體。而枚舉和類只占很小一部分

比如 Bool、 Int 、Double、 String 、Array、 Dictionary

所有的結(jié)構(gòu)體 都有編譯器自動(dòng)生成的初始化器
編譯器會(huì)根據(jù)實(shí)際情況 可能會(huì)為結(jié)構(gòu)體生成多個(gè)初始化器
生成初始化器的宗旨是:保證所有成員都有初始值(這是秘訣 要記?。?/p>

例如下面的幾種類型
1、Point x 和 y 沒有初始值

struct Point {
    var x: Int
    var y: Int
}

//由于初始化器的宗旨是:保證所有成員都有初始值
// Point 中 的 x 和 y 都沒有初始值 
// 所以編譯器自動(dòng)給Point 生成一個(gè)兩個(gè)參數(shù)的初始化器

var p = Point.init(x: 10, y: 10)

2、Point1 x沒有初始值 y有初始值

struct Point1 {
    var x: Int
    var y: Int = 10
}

//由于初始化器的宗旨是:保證所有成員都有初始值
// Point1 中 的 x沒有初始值   y有初始值 
// 所以編譯器自動(dòng)給Point1 生成如下兩個(gè)初始化器

var p1 = Point1.init(x: 10, y: 30)
var p11 = Point1.init(x: 30)

3、Point2 x和y都有初始值

struct Point2 {
    var x: Int = 20
    var y: Int = 10
}

//由于初始化器的宗旨是:保證所有成員都有初始值
// Point2 中 的 x  和  y 都有初始值 
// 所以編譯器自動(dòng)給Point2 生成如下四個(gè)初始化器

var p21 = Point2.init(x: 0, y: 20)
var p22 = Point2.init(x:0)
var p23 = Point2.init(y:0)
var p24 = Point2.init()

4、Point3 x和y都為可選型 (因?yàn)榭蛇x型初始值 都為nil)

struct Point3 {
    var x: Int?
    var y: Int?
}

//由于初始化器的宗旨是:保證所有成員都有初始值
// Point3 中 的 x  和  y   都為可選型 
// 由于可選型都有默認(rèn)值 nil
// 所以編譯器自動(dòng)給Point3 生成如下四個(gè)初始化器

var p31 = Point3.init(x: 0, y: 20)
var p32 = Point3.init(x:0)
var p33 = Point3.init(y:0)
var p34 = Point3.init()

自定義初始化器

注意??:一旦定義了結(jié)構(gòu)體的初始化器 編譯器就不會(huì)幫助它生成其他的初始化器

例如

struct Point4 {
    var x: Int = 0
    var y: Int = 0
    init(x: Int,y: Int){
        self.x = x
        self.y = y
    }
}

//由于我們自定義了一個(gè)初始化器  所以編譯器就不會(huì)再為我們生成初始化器
//所以 我們 初始化Point4 只能用我們自己定義的
var p4 = Point4.init(x: 10, y: 20)

一、類 是引用類型 (指針類型)

類的定義和結(jié)構(gòu)體類似 但是編譯器不會(huì)為類自動(dòng)生成可傳入成員值的初始化器

注意??:
如果類的所有成員都在定義的時(shí)候指定了類初始值 編譯器就會(huì)為類生成無參的初始化器
成員的初始化就是在無參的初始化器中完成的
例如

class Point {
    var x: Int = 0
    var y: Int = 1
}

// 因?yàn)?類的所有成員都在定義的時(shí)候指定了類初始值
//所以編譯器為Point 自動(dòng)生成了一個(gè)初始化器

let p1 = Point.init()

類 和 結(jié)構(gòu)體 的本質(zhì)區(qū)別

在swift中 結(jié)構(gòu)體和類 都能定義方法
結(jié)構(gòu)體是值類型
枚舉也是值類型

類是引用類型(指針類型)

舉例說明

struct Point {
    var x: Int = 3
    var y: Int = 4
}

class Size {
    var width = 1
    var hight = 2
}


func test(){
    var point = Point()
    var size = Size()
}

text 函數(shù)在??臻g的分布情況如下圖所示 (假設(shè)開始地址是 0x10000)


text 函數(shù)在??臻g的分布.png

解析:
由于 text 是一個(gè)函數(shù) 所以他存儲(chǔ)在??臻g
棧空間 前16個(gè)字節(jié) 分別存放 Point (值類型)的兩個(gè)成員變量的值

后8個(gè)字節(jié) 存放的 是一個(gè)指針變量(也就是 size size是一個(gè)指針)

size 指針變量內(nèi)存中存放的是 size對象內(nèi)存地址(這個(gè)地址是在堆空間 因?yàn)閟ize是一個(gè)對象 創(chuàng)建的時(shí)候需要 alloc 開辟堆空間)

size對象的前 8個(gè)字節(jié) 存放的是 類型信息的地址 它指向size的元類 元類來存放類的一些信息(如:方法、類方法)

8--16個(gè)字節(jié) 存放的是 對象的引用計(jì)數(shù)
后面就是存放類的一些成員信息

值類型 與 引用類型的區(qū)別

值類型 賦值給 var、let 或者 給函數(shù)傳參 是直接將內(nèi)容拷貝一份 會(huì)產(chǎn)生全新的文件副本

修改 原數(shù)據(jù) 對 副本沒有任何影響
修給 副本 對 原數(shù)據(jù)沒有任何影響

注意??:
在Swift標(biāo)準(zhǔn)庫中,為了提升性能,String、Array、Dictionary、Set采取了Copy On Write的技術(shù) (也就是說 只有在對其進(jìn)行修改的時(shí)候才會(huì)去深度拷貝 如果不修改僅僅是淺拷貝)
比如僅當(dāng)有“寫”操作時(shí),才會(huì)真正執(zhí)行拷貝操作

對于標(biāo)準(zhǔn)庫值類型的賦值操作,Swift 能確保最佳性能,所有沒必要為了保證最佳性能來避免賦值

建議:不需要修改 盡量換成let

例如

var s1 = "Jack" 
var s2 = s1 
print(s1)
s2.append("_Rose")
print(s2)

當(dāng)代碼走到14行時(shí) s1 和 s2 他們倆指向的是同一塊內(nèi)存 如下圖所示

47E1DF5C72CCA51DE99C1AC111A55194.png

當(dāng)代碼走到16行時(shí) s1 和 s2 他們倆指向的是不同內(nèi)存 如下圖所示


A51727869D5DC2B9EACED04D55992885.png

原因是因?yàn)?s2 進(jìn)行了改寫 所以就就調(diào)用 copy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 一. 結(jié)構(gòu)體 1. 結(jié)構(gòu)體簡介 在 Swift 標(biāo)準(zhǔn)庫中,絕大多數(shù)的公開類型都是結(jié)構(gòu)體,而枚舉和類只占很小一部分,...
    Imkata閱讀 625評論 0 2
  • 結(jié)構(gòu)體 在 Swift 標(biāo)準(zhǔn)庫中,絕大多數(shù)的公開類型都是結(jié)構(gòu)體,而枚舉和類只占很小一部分 比如Bool、Int、D...
    蔣斌文閱讀 227評論 0 1
  • swift中,我們在一個(gè)文件中定義結(jié)構(gòu)體和類并實(shí)現(xiàn)他的接口。 基礎(chǔ)知識(shí) 結(jié)構(gòu)體和類的比較 相同點(diǎn): 屬性:保存數(shù)據(jù)...
    枯樹戀閱讀 1,494評論 0 0
  • 結(jié)構(gòu)體 在 Swift 標(biāo)準(zhǔn)庫中,絕大多數(shù)的公開類型都是結(jié)構(gòu)體,而枚舉和類只占很小一部分 Bool、Int、Dou...
    一抹相思淚成雨閱讀 219評論 0 1
  • ??在Swift標(biāo)準(zhǔn)庫中,絕大多數(shù)的公開類型都是結(jié)構(gòu)體,而枚舉和類之占一小部分,比如:Bool、Int、Doubl...
    Aliv丶Zz閱讀 575評論 0 0