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

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

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

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

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

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

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

2、 如果值類型在全局區(qū)創(chuàng)建的 它存儲在代碼區(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)體 都有編譯器自動生成的初始化器
編譯器會根據(jù)實際情況 可能會為結(jié)構(gòu)體生成多個初始化器
生成初始化器的宗旨是:保證所有成員都有初始值(這是秘訣 要記住)

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

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

//由于初始化器的宗旨是:保證所有成員都有初始值
// Point 中 的 x 和 y 都沒有初始值 
// 所以編譯器自動給Point 生成一個兩個參數(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有初始值 
// 所以編譯器自動給Point1 生成如下兩個初始化器

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 都有初始值 
// 所以編譯器自動給Point2 生成如下四個初始化器

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都為可選型 (因為可選型初始值 都為nil)

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

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

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)體的初始化器 編譯器就不會幫助它生成其他的初始化器

例如

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

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

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

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

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

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

// 因為 類的所有成員都在定義的時候指定了類初始值
//所以編譯器為Point 自動生成了一個初始化器

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ù)在椞枷耄空間的分布情況如下圖所示 (假設(shè)開始地址是 0x10000)


text 函數(shù)在棧空間的分布.png

解析:
由于 text 是一個函數(shù) 所以他存儲在椈侔校空間
楇时迹空間 前16個字節(jié) 分別存放 Point (值類型)的兩個成員變量的值

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

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

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

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

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

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

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

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

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

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

例如

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

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

47E1DF5C72CCA51DE99C1AC111A55194.png

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


A51727869D5DC2B9EACED04D55992885.png

原因是因為 s2 進行了改寫 所以就就調(diào)用 copy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬芥,一起剝皮案震驚了整個濱河市窘拯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坝茎,老刑警劉巖涤姊,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗤放,居然都是意外死亡思喊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門次酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恨课,“玉大人,你說我怎么就攤上這事岳服〖凉” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵吊宋,是天一觀的道長纲辽。 經(jīng)常有香客問我,道長璃搜,這世上最難降的妖魔是什么拖吼? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮这吻,結(jié)果婚禮上吊档,老公的妹妹穿的比我還像新娘。我一直安慰自己唾糯,他們只是感情好怠硼,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布鬼贱。 她就那樣靜靜地躺著,像睡著了一般香璃。 火紅的嫁衣襯著肌膚如雪这难。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天增显,我揣著相機與錄音,去河邊找鬼脐帝。 笑死同云,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堵腹。 我是一名探鬼主播炸站,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疚顷!你這毒婦竟也來了旱易?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤腿堤,失蹤者是張志新(化名)和其女友劉穎阀坏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笆檀,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡忌堂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酗洒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士修。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖樱衷,靈堂內(nèi)的尸體忽然破棺而出棋嘲,到底是詐尸還是另有隱情,我是刑警寧澤矩桂,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布沸移,位于F島的核電站,受9級特大地震影響侄榴,放射性物質(zhì)發(fā)生泄漏阔籽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一牲蜀、第九天 我趴在偏房一處隱蔽的房頂上張望笆制。 院中可真熱鬧,春花似錦涣达、人聲如沸在辆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匆篓。三九已至浑度,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸦概,已是汗流浹背箩张。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窗市,地道東北人艘刚。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓惹恃,卻偏偏與公主長得像稽亏,于是被迫代替她去往敵國和親沛硅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 一. 結(jié)構(gòu)體 1. 結(jié)構(gòu)體簡介 在 Swift 標(biāo)準(zhǔn)庫中摄狱,絕大多數(shù)的公開類型都是結(jié)構(gòu)體脓诡,而枚舉和類只占很小一部分,...
    Imkata閱讀 615評論 0 2
  • 結(jié)構(gòu)體 在 Swift 標(biāo)準(zhǔn)庫中媒役,絕大多數(shù)的公開類型都是結(jié)構(gòu)體祝谚,而枚舉和類只占很小一部分 比如Bool、Int酣衷、D...
    蔣斌文閱讀 221評論 0 1
  • swift中踊跟,我們在一個文件中定義結(jié)構(gòu)體和類并實現(xiàn)他的接口。 基礎(chǔ)知識 結(jié)構(gòu)體和類的比較 相同點: 屬性:保存數(shù)據(jù)...
    枯樹戀閱讀 1,481評論 0 0
  • 結(jié)構(gòu)體 在 Swift 標(biāo)準(zhǔn)庫中鸥诽,絕大多數(shù)的公開類型都是結(jié)構(gòu)體商玫,而枚舉和類只占很小一部分 Bool、Int牡借、Dou...
    一抹相思淚成雨閱讀 212評論 0 1
  • ??在Swift標(biāo)準(zhǔn)庫中拳昌,絕大多數(shù)的公開類型都是結(jié)構(gòu)體,而枚舉和類之占一小部分钠龙,比如:Bool炬藤、Int、Doubl...
    Aliv丶Zz閱讀 558評論 0 0