swift Equatable

我來了泣港,swift

定義

用于做值類型對(duì)比的協(xié)議。

適用范圍

遵循Equatable的類型都可以使用==或是!=符號(hào)對(duì)比判斷居暖。這個(gè)類型包括struct/class/enum

實(shí)現(xiàn)原理

任何遵循Equatable的類型子刮,都需要實(shí)現(xiàn)方法static func ==(lhs: Self, rhs: Self) -> Bool在這個(gè)方法內(nèi)按照指定的值和值間對(duì)比關(guān)系返回true或是false,外部表現(xiàn)為==或是!=的結(jié)果

struct Human: Equatable {
    var name: String
    var age = 5
    
    static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.name == rhs.name
    }
}

let tom = Human(name: "tom", age: 5)
let tim = Human(name: "tim", age: 6)
tom == tim // false

let man1 = Human(name: "tom", age: 5)
let man2 = Human(name: "tom", age: 6)
man1 == man2 // true

Human對(duì)Equatable方法定義為只判斷name屬性是否值相同煌恢,即使age屬性不同,man1==man2結(jié)果是true

在不同類型中的差異

  • class遵循Equatable必須要實(shí)現(xiàn)static func ==(lhs: Self, rhs: Self) -> Bool方法震庭。但是瑰抵,struct遵循Equatable可以不用實(shí)現(xiàn)static func ==(lhs: Self, rhs: Self) -> Bool方法,默認(rèn)將struct實(shí)例中所有屬性對(duì)比并返回結(jié)果
struct Dog: Equatable {
    var name: String
    var age = 0
}

let dog1 = Dog(name: "tom", age: 1)
let dog2 = Dog(name: "tom", age: 1)
dog1 == dog2  // true

let dog3 = Dog(name: "tom", age: 1)
let dog4 = Dog(name: "tom", age: 2)
dog3 == dog4  // false

struct Dog遵循Equatable協(xié)議但沒有實(shí)現(xiàn)協(xié)議方法其實(shí)例dog1與dog2實(shí)例相等归薛,dog3與dog3實(shí)例不相等

  • 數(shù)組等容器類(數(shù)組/字典等)內(nèi)部的元素需要遵循Equatable才能實(shí)現(xiàn)一些能力,例如contains(_:)
let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]

let nameToCheck = "Kofi"
if students.contains(nameToCheck) {
    print("\(nameToCheck) is signed up!")  // Prints "Kofi is signed up!"
} else {
    print("No record of \(nameToCheck).")
}

  • swift standard library中的大部分基礎(chǔ)類型默認(rèn)已經(jīng)遵循Equatable匪蝙,例如Int/Array/Dictionary/Set
  • struct重的屬性如果有不遵守Equatable主籍,那么其實(shí)例無法用==
class MyClassNoEquatable {
    
}

struct NoEquatableStruct: Equatable {
    var mc = MyClassNoEquatable()
    
}

let nes1 = NoEquatableStruct()
let nes2 = NoEquatableStruct()
nes1 == nes2

上面代碼會(huì)報(bào)錯(cuò),提示Type 'NoEquatableStruct' does not conform to protocol 'Equatable'

協(xié)議間的關(guān)聯(lián)

Hashable協(xié)議基于Equatable協(xié)議逛球,對(duì)于struct遵守Hashable并不需要實(shí)現(xiàn)Equatable方法千元,但是對(duì)于class遵守Hashable必須要實(shí)現(xiàn)Equatable的方法
Comparable協(xié)議基于Equatable

=====

  • Equatable本質(zhì)是對(duì)屬性的值對(duì)比,適用范圍有struct/class/enum
  • ===是對(duì)class實(shí)例指針的對(duì)比颤绕,且僅適用于class實(shí)例
class IntegerRef: Equatable {
    let value: Int
    init(_ value: Int) {
        self.value = value
    }

    static func == (lhs: IntegerRef, rhs: IntegerRef) -> Bool {
        return lhs.value == rhs.value
    }
}
let a = IntegerRef(100)
let b = IntegerRef(100)

print(a == a, a == b, separator: ", ") // Prints "true, true"

let c = a
print(c === a, c === b, separator: ", ") // Prints "true, false"

參考

Equatable
Swift Equatable

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幸海,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奥务,更是在濱河造成了極大的恐慌物独,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氯葬,死亡現(xiàn)場離奇詭異挡篓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帚称,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門官研,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闯睹,你說我怎么就攤上這事戏羽。” “怎么了楼吃?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵始花,是天一觀的道長妄讯。 經(jīng)常有香客問我,道長衙荐,這世上最難降的妖魔是什么捞挥? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮忧吟,結(jié)果婚禮上砌函,老公的妹妹穿的比我還像新娘。我一直安慰自己溜族,他們只是感情好讹俊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著煌抒,像睡著了一般仍劈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寡壮,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天贩疙,我揣著相機(jī)與錄音,去河邊找鬼况既。 笑死这溅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棒仍。 我是一名探鬼主播悲靴,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莫其!你這毒婦竟也來了癞尚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤乱陡,失蹤者是張志新(化名)和其女友劉穎浇揩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憨颠,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡临燃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烙心。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膜廊。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淫茵,靈堂內(nèi)的尸體忽然破棺而出爪瓜,到底是詐尸還是另有隱情,我是刑警寧澤匙瘪,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布铆铆,位于F島的核電站蝶缀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薄货。R本人自食惡果不足惜翁都,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谅猾。 院中可真熱鬧柄慰,春花似錦、人聲如沸税娜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬矩。三九已至概行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧岳,已是汗流浹背凳忙。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禽炬,地道東北人涧卵。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像瞎抛,于是被迫代替她去往敵國和親艺演。 傳聞我的和親對(duì)象是個(gè)殘疾皇子却紧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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