★ iOS高級(jí):Swift入門精講③ 01 swift編程-06-枚舉-05答疑

前言:

本篇僅為視頻學(xué)習(xí)筆記

短接上篇:
★ iOS高級(jí):Swift入門精講③ 01 swift編程-05-枚舉-04原始值內(nèi)存分布

★ 這個(gè)原始值命咐,它存儲(chǔ)到什么地方呢仍劈?(無(wú)需糾結(jié))
enum Season: Int {
case spring = 1, summer, autumn, winter
}

 var s = Season.spring
 var s1 = Season.spring
 var s2 = Season.spring
 
 s2.rawValue
 
 MemoryLayout<Season>.size        // 1,實(shí)際用到的空間大小
 MemoryLayout<Season>.stride      // 1,分配占用的空間大小
 MemoryLayout<Season>.alignment   // 1,對(duì)齊參數(shù)

我們把它改成上面代碼那樣,冒號(hào)Int揭鳞。(enum Season: Int)。不就是代表枚舉Season的原始值是Int類型嗎梆奈,所以呢野崇,我們寫了一個(gè)原始值spring = 1。summer, autumn, winter依次默認(rèn)為2亩钟、3乓梨、4。

之前径荔,說(shuō)過(guò)督禽,這個(gè)原始值不是存儲(chǔ)到s變量里面去的。像這些枚舉變量总处。它只占用一個(gè)字節(jié)狈惫,它一個(gè)字節(jié)就能搞的清楚,它是spring鹦马,是summer胧谈,是autumn,還是winter荸频。

那你可能就會(huì)想菱肖,那么這個(gè)原始值存儲(chǔ)到哪里呢?其實(shí)這個(gè)東西旭从,你思考一下稳强,它不存也可以啊,怎么不存也可以呢和悦?

因?yàn)橥艘撸阆胂耄隳迷贾挡贿^(guò)就是調(diào)用 s2.rawValue鸽素。那么這個(gè)rawValue褒繁,完全怎么可以實(shí)現(xiàn)呢?

完全可以這樣實(shí)現(xiàn)馍忽,如下代碼:

 enum Season: Int {
     case spring = 1, summer, autumn, winter
     
     func rawValue() -> Int {
         if self == 0 return 1
         if self == 1 return 2
         if self == 2 return 3
         if self == 3 return 4
     }
 }

所以棒坏,完全可以不用思考燕差,它存在什么地方,它完全可以不用存坝冕。

是不是可以這個(gè)樣子徒探,如果發(fā)現(xiàn)我自己內(nèi)存里面存儲(chǔ)的是0,也就是存儲(chǔ)的是spring喂窟,我們就return 1刹帕。那么,如果我發(fā)現(xiàn)自己內(nèi)存里谎替,存儲(chǔ)的是1,不就意味著我是summer蹋辅,我是summer钱贯,那么我的原始值就是return 2。那么我這個(gè)rawValue獲取原始值的實(shí)現(xiàn)內(nèi)部完全可以如上面代碼那樣寫侦另。


所以秩命,大家沒(méi)有必要去糾結(jié),如果這里寫的是enum Season:String,那么你關(guān)聯(lián)的這個(gè)原始值褒傅,它存儲(chǔ)到什么地方呢弃锐?它不一定需要存儲(chǔ)殿托。所以,這個(gè)放哪里支竹,這個(gè)跟你無(wú)關(guān)。你只要搞清楚礼搁,這個(gè)枚舉變量占用多少內(nèi)存就可以了饶碘。

★ Password枚舉為什么實(shí)際用到的空間大小為33個(gè)字節(jié)呢?

 enum Password {
     case number(Int,Int,Int,Int)  // 32
     case other  // 1
 }
 
 var pwd  = Password.number(5, 6, 4, 7)  // 占用32字節(jié)
   pwd = .other
 var pwd1 = Password.number(2, 4, 3, 0)  // 占用32字節(jié)
 var pwd2 = Password.number(23, 43, 133,30)  // 占用32字節(jié)

 
 MemoryLayout<Password>.stride      // 40扎运,分配占用的空間大小
 MemoryLayout<Password>.size        // 33饮戳,實(shí)際用到的空間大小
 MemoryLayout<Password>.alignment   // 8豪治,對(duì)齊參數(shù)

再說(shuō)另外一個(gè)問(wèn)題,剛剛說(shuō)到Password這個(gè)枚舉變量的話莹捡,那么我定義一個(gè)pwd枚舉變量鬼吵。最后真正分配的內(nèi)存是多少? 是40,但實(shí)際上真正利用起來(lái)的是33齿椅。其實(shí)這個(gè)33是怎么利用起來(lái)的呢?

我們?cè)? case number(Int,Int,Int,Int) 這個(gè)位置標(biāo)記一個(gè)32涣脚,是沒(méi)有問(wèn)題的。但是我們?cè)赾ase other // 1標(biāo)記一個(gè)1的話矾麻,其實(shí)不是很嚴(yán)謹(jǐn)芭梯。那么這個(gè)1险耀,這個(gè)字節(jié)是怎么用的呢甩牺?

其實(shí)累奈,有的人會(huì)怎么想呢?它會(huì)想澎媒,你這個(gè)pwd這個(gè)枚舉變量,只占用32個(gè)字節(jié)请敦,不就夠了嗎储玫?為什么呢?首先缘缚,如果你的pwd是 case number(Int,Int,Int,Int) 這種類型的話4個(gè)證書,剛好是32個(gè)字節(jié)窝爪,存儲(chǔ)到里面去。但是蒲每,如果你是other的話喻括,大家有可能會(huì)想,像下面這種:

 enum Password {
     case other, abc, ddd
 }

非常普通的這些成員望蜡,他是不是只需要一個(gè)字節(jié)就夠了。比如說(shuō)脖律,other是0、abc是1芦疏,ddd是2微姊。是不是用一個(gè)字節(jié),就能把這些數(shù)值表達(dá)清楚了兢交。那么,一說(shuō)到這個(gè),大家可能會(huì)想与倡,那么你存儲(chǔ)other只需要1個(gè)字節(jié)纺座,但是在var pwd = Password.number(5, 6, 4, 7) 這行時(shí),我們不是已經(jīng)分配了32個(gè)字節(jié)給pwd了嗎净响?

那么你的.other賦值給pwd。( pwd = .other )赞别,就不能將這個(gè)other配乓,1個(gè)字節(jié)的數(shù)據(jù)存儲(chǔ)到var pwd = Password.number(5, 6, 4, 7) 這32個(gè)字節(jié)里面去嗎?肯定會(huì)有這樣的問(wèn)題犹芹,有這樣的問(wèn)題說(shuō)明你還沒(méi)想透。

你思考一下飒焦,如果你將 .other 這一個(gè)值屿笼。假設(shè)你這個(gè)值 case other是 0翁巍。那么志电,你能把這個(gè)0存儲(chǔ)到剛剛 Password.number(5, 6, 4, 7) 32個(gè)字節(jié)里面去嗎?
那我就問(wèn)你將來(lái)你怎么判斷呢例朱?

你怎么知道鱼蝉,它是.otner還是 .number呢?根本就分不清渔隶。請(qǐng)問(wèn)我現(xiàn)在給你32個(gè)字節(jié)洁奈,你怎么知道32個(gè)字節(jié)里面存儲(chǔ)的是.otner這個(gè)家伙還是這(5, 6, 4, 7) 四個(gè)家伙。

因?yàn)槟隳玫?2利术,完全可以把這32個(gè)字節(jié)分成4個(gè)部分印叁,每個(gè)部分8個(gè)字節(jié),然后分別認(rèn)為是這(Int,Int,Int,Int) 四個(gè)整型轮蜕。

我也可以拿到32個(gè)字節(jié)中,最前面的一個(gè)字節(jié)率触,當(dāng)作是 .other汇竭。所以,你必須var pwd = Password.number(5, 6, 4, 7) // 32 + 1 其中的一個(gè)字節(jié)是來(lái)告訴你是case other,這個(gè)類型韩玩,還是case number(Int,Int,Int,Int) // 32 這個(gè)類型。你可以這樣思考合愈,這是用來(lái)辨別的。就是從字節(jié)中益老,我們可以看得出來(lái)寸莫,我們整體數(shù)據(jù)是case number(Int,Int,Int,Int) 這個(gè)家伙,還是case other這個(gè)家伙膘茎。

所以,只給它enum Password 32個(gè)字節(jié)是不行的态坦。所以棒拂,必然是32 + 1,那么谜诫,你可能會(huì)想為什么不是 32 + 2呢攻旦?沒(méi)必要這么浪費(fèi),你搞出一個(gè)來(lái)敬特,就行了牺陶。

既然,你需要占用33個(gè)字節(jié)皱炉,再加上它的內(nèi)存對(duì)齊參數(shù)是8個(gè)字節(jié)狮鸭,所以最后分配給它的是40個(gè)字節(jié)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灾部,一起剝皮案震驚了整個(gè)濱河市惯退,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锁蠕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悯搔,死亡現(xiàn)場(chǎng)離奇詭異舌仍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抡笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門推姻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人增炭,你說(shuō)我怎么就攤上這事拧晕。” “怎么了厂捞?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵靡馁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我臭墨,道長(zhǎng),這世上最難降的妖魔是什么尤误? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任结缚,我火速辦了婚禮红竭,結(jié)果婚禮上码党,老公的妹妹穿的比我還像新娘斥黑。我一直安慰自己,他們只是感情好锌奴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布鹿蜀。 她就那樣靜靜地躺著,像睡著了一般茴恰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伐庭,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天分冈,我揣著相機(jī)與錄音,去河邊找鬼集乔。 笑死坡椒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倔叼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渡嚣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肥印!你這毒婦竟也來(lái)了绝葡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敷硅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绞蹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡景殷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年猿挚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驶鹉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡办绝,死狀恐怖词顾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肉盹,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布骤肛,位于F島的核電站窍蓝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淑玫。R本人自食惡果不足惜面睛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望土涝。 院中可真熱鬧幌墓,春花似錦冀泻、人聲如沸蜡饵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)您没。三九已至鸟召,卻和暖如春氨鹏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跟继。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工镣丑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人金吗。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓趣竣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卫袒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子单匣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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