Swift 關(guān)鍵詞 -- struct/enum/mutating

struct

struct 值引用

在swift中,類型引用和值引用的區(qū)別在于苟穆,對于類型引用(class reference),將變量a賦值給變量b雳旅,即b = a,這樣的賦值語句僅僅將b的指針與a的指針一樣抵拘,指向同一塊內(nèi)存區(qū)域型豁,此時改變b的值,a也會跟著改變充尉;而對于值引用(value reference)衣形,賦值語句b = a處理的過程是開辟一個新的內(nèi)存b,將a變量的內(nèi)容拷貝后存放到內(nèi)存b倒源,這時a和b完全沒有關(guān)系的兩個變量句狼,對b的改變不會影響到a,反之亦然鲜锚。

// struct value reference, class reference

func valueCopyValid() -> Void {
    var personXm = Person(name: "xiao-min", age: 6, sex: .man)
    var personXmCopy = personXm
    personXmCopy.age = 20
    print("\(personXm) : \(personXmCopy)")
}

print:
Person(name: "xiao-min", age: 6, sex: swift_learn_keyword.Sex.man) 
Person(name: "xiao-min", age: 20, sex: swift_learn_keyword.Sex.man)

struct和class的主要區(qū)別,

  1. struct是值引用旺隙,而class是類型引用
  2. struct沒有繼承的功能骏令,class有繼承功能
    struct和class這兩個基本層面的區(qū)別,體現(xiàn)了區(qū)別于Objective-C語言榔袋,swift語言帶來了全新的天翻地覆的改變。

首先說第一點區(qū)別妥粟,從swift的更新和struct不斷完善來看勾给,蘋果公司更加推薦使用struct來代替class滩报,因為struct值引用和class類型引用這點區(qū)別播急,保證使用struct編碼能寫出更加安全可靠的代碼。為什么這樣說呢桩警,class類型引用在賦值時是將變量指向了同一塊內(nèi)存地址,這在一個長時間的跨度上會帶來一些意想不到的問題握截,試想一個簡單的例子,viewControllerA持有一個NSMutableArray數(shù)組mutalbeArray川蒙,它包含100條user信息长已,此時將mutableArray賦值給viewControllerB,對于viewControllerB而言康聂,它僅僅需要前10條user信息恬汁,所以它將mutableArray多余的信息刪除了,這樣一個腦殘的操作導致了viewControllerA模塊展示錯誤和潛在的邏輯錯誤氓侧。而使用struct值引用則不會出現(xiàn)這樣的問題导狡。

第二點區(qū)別,struct沒有繼承的功能旱捧,這是因為swift在本質(zhì)上來說是面向協(xié)議(Protocol Oriented)的語言,struct沒有也不需要繼承的功能氓癌,為了實現(xiàn)某個功能,struct去服從并實現(xiàn)某個協(xié)議就即可贫橙,從一個較高的層次來看贪婉,struct+protocol是構(gòu)成swift面向協(xié)議語言的兩個基石。這一點不在本文討論范圍卢肃,不再贅述疲迂。

為什么要使用struct呢星压?總結(jié)就是struct可以保證代碼更加安全可靠,以及struct+protocol更加切合swift面向協(xié)議編程的初衷鬼譬。

enum

/*
- =左邊的值是枚舉值,例如 MON
- =右邊的值在swift中稱為 RawValue(原始值)逊脯,例如 "MON"
- 兩者的關(guān)系為:case 枚舉值 = rawValue原始值
*/
enum Week: String{
    case MON = "MON"
    case TUE = "TUE"
    case WED = "WED"
    case THU = "THU"
    case FRI = "FRI"
    case SAT = "SAT"
    case SUN = "SUN"
}

enum Week1: String{
    case MON, TUE, WED = "WED", THU, FRI, SAT, SUN
}

//<!--Int類型-->
//MON是從0開始一次遞推优质,而WED往后是從10開始一次遞推
enum Week2: Int{
    case MON, TUE, WED = 2, THU, FRI, SAT, SUN
}

enum Week3 {
    case work(day: Week2)
    case free(day: Week2)
}

mutating

struct Person {
    
    var name: String
    var age: Int
    var sex: Sex
    
    init(name: String, age: Int, sex: Sex) {
        self.age = age
        self.name = name
        self.sex = sex
    }
    
    func string() -> String {
        return "\(name) - \(age) - \(sex)"
    }
    
    func addAge(count: Int) {
        self.age += count
    }
}

error: Left side of mutating operator isn't mutable: 'self' is immutable Mark method 'mutating' to make 'self' mutable

說白了 struct/enum 內(nèi)部聲明的屬性是內(nèi)部不可變的(與值引用又一定關(guān)系),需要內(nèi)部修改值那么需要申明 mutating 關(guān)鍵詞進行標記

struct Person {
    
    var name: String
    var age: Int
    var sex: Sex
    
    init(name: String, age: Int, sex: Sex) {
        self.age = age
        self.name = name
        self.sex = sex
    }
    
    func string() -> String {
        return "\(name) - \(age) - \(sex)"
    }
    
    mutating func addAge(count: Int) {
        self.age += count
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末军洼,一起剝皮案震驚了整個濱河市巩螃,隨后出現(xiàn)的幾起案子避乏,更是在濱河造成了極大的恐慌拍皮,老刑警劉巖铆帽,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爹橱,死亡現(xiàn)場離奇詭異愧驱,居然都是意外死亡组砚,警方通過查閱死者的電腦和手機惫确,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門改化,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陈肛,“玉大人句旱,你說我怎么就攤上這事谈撒】心洌” “怎么了溯乒?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵矛纹,是天一觀的道長或南。 經(jīng)常有香客問我钟哥,道長腻贰,這世上最難降的妖魔是什么播演? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任翼闽,我火速辦了婚禮感局,結(jié)果婚禮上询微,老公的妹妹穿的比我還像新娘撑毛。我一直安慰自己唧领,他們只是感情好雌续,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艇肴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膝但。 梳的紋絲不亂的頭發(fā)上跟束,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音温学,去河邊找鬼仗岖。 笑死轧拄,一個胖子當著我的面吹牛檩电,可吹牛的內(nèi)容都是我干的俐末。 我是一名探鬼主播鹅搪,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼恢准,長吁一口氣:“原來是場噩夢啊……” “哼馁筐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起果正,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攒菠,沒想到半個月后辖众,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凹炸,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡奕筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锣光。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬刷。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡办成,死狀恐怖迂卢,靈堂內(nèi)的尸體忽然破棺而出靶壮,到底是詐尸還是另有隱情腾降,我是刑警寧澤螃壤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蚁滋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梢卸。R本人自食惡果不足惜蛤高,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一沟涨、第九天 我趴在偏房一處隱蔽的房頂上張望裹赴。 院中可真熱鬧,春花似錦棋返、人聲如沸睛竣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趁俊,卻和暖如春寺擂,著一層夾襖步出監(jiān)牢的瞬間怔软,已是汗流浹背挡逼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工吝梅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苏携,地道東北人穿扳。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像履羞,于是被迫代替她去往敵國和親忆首。 傳聞我的和親對象是個殘疾皇子详幽,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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