Swift - Hashable 和 Equatable 協(xié)議

在開發(fā)YLLabel過程中,收到這樣兩個error:

Type 'YLLabelType' does not conform to protocol 'Hashable'
Type 'YLLabelType' does not conform to protocol 'Equatable'

開始不知道為什么會報這個錯,后來看了一些資料,寫出來,大家多多指教;

一. Hashable 哈希

一個類型為了存儲在集合中追他,該類型必須是可哈希化的-該類型必須提供一種方法計算它的哈希值旺订,一個哈希值為Int類型,相等的對象哈希值必須相同情龄。
Swift的所有基本類型(形如String灭忠,Int简卧,Double,Bool)默認是可哈献艴耍化的闰挡,可以作為集合的值的類型或者字典的鍵的類型。沒有關聯(lián)值的枚舉成員值默認也是可哈嫌拱化的解总。(萬幸的是,我用到了枚舉關聯(lián)值,不然我是不知道這些的)

因為要實現(xiàn)用戶自定義高亮類型,所以YLLabelType里提供了這樣一個接口
case custom(pattern:String)
pattern 是想要匹配的規(guī)則

用戶想給自定義的類型添加顏色和點擊事件的時候,
提供了customColor 和 customHandler
類型是字典, type 作為 key , 顏色和點擊事件作為 value
這時,就提示了上面提到的
Type 'YLLabelType' does not conform to protocol 'Hashable'
我們可以看到 協(xié)議Hashable是準守了Equatable協(xié)議,并且提供了一個需要我們實現(xiàn) get 方法的屬性 hashValue

public protocol Hashable : Equatable {

    /// The hash value.
    ///
    /// Hash values are not guaranteed to be equal across different executions of
    /// your program. Do not save hash values to use during a future execution.
    public var hashValue: Int { get }
}

我的實現(xiàn)(-3,-2,-1,隨手寫的,能區(qū)分就好吧???求指點)

extension YLLabelType : Hashable, Equatable{
    public var hashValue : Int {
        switch self {
        case .hashtag   : return -3
        case .mention   : return -2
        case .URL       : return -1
        case .custom(let pattern) : return pattern.hashValue
        }
    }
}

二. Equatable 判等

在判等上 Swift 的行為和 Objective-C 有著巨大的差別。在 Objective-C 中 == 這個符號的意思是判斷兩個對象是否指向同一塊內存地址姐仅。其實很多時候這并不是我們經常所期望的判等花枫,我們更關心的往往還是對象的內容相同,而這種意義的相等即使兩個對象引用的不是同一塊內存地址時掏膏,也是可以做到的劳翰。

因為YLLabelType加入了case custom(pattern:String)
所以判等的時候,就需要我們遵循Equatable


public protocol Equatable {

    /// Returns a Boolean value indicating whether two values are equal.
    ///
    /// Equality is the inverse of inequality. For any values `a` and `b`,
    /// `a == b` implies that `a != b` is `false`.
    ///
    /// - Parameters:
    ///   - lhs: A value to compare.
    ///   - rhs: Another value to compare.
    public static func ==(lhs: Self, rhs: Self) -> Bool
}

第一眼看到怪怪的,其實就是方法名是==,和普通方法一樣了就
我的實現(xiàn)

public func == (lhs: YLLabelType, rhs: YLLabelType) -> Bool {
    
    switch (lhs, rhs) {
    case (.mention, .mention): return true
    case (.hashtag, .hashtag): return true
    case (.URL, .URL): return true
    case (.custom(let pattern1), .custom(let pattern2)): 
                       return pattern1 == pattern2
    default: return false
    }
}

還要多說一點的是
對于== 的實現(xiàn)我們并沒有像實現(xiàn)其他一些協(xié)議一樣將其放在對應的 extension里,而是放在了全局,因為你應該需要在全局范圍內都能使用 ==

這時候,可能會報一個錯

只要在枚舉定義enum前面加上public就可以了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馒疹,隨后出現(xiàn)的幾起案子佳簸,更是在濱河造成了極大的恐慌,老刑警劉巖颖变,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件生均,死亡現(xiàn)場離奇詭異,居然都是意外死亡腥刹,警方通過查閱死者的電腦和手機马胧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衔峰,“玉大人佩脊,你說我怎么就攤上這事〉媛保” “怎么了威彰?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長穴肘。 經常有香客問我歇盼,道長,這世上最難降的妖魔是什么评抚? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任旺遮,我火速辦了婚禮赵讯,結果婚禮上盈咳,老公的妹妹穿的比我還像新娘耿眉。我一直安慰自己,他們只是感情好鱼响,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布鸣剪。 她就那樣靜靜地躺著,像睡著了一般丈积。 火紅的嫁衣襯著肌膚如雪筐骇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天江滨,我揣著相機與錄音铛纬,去河邊找鬼。 笑死唬滑,一個胖子當著我的面吹牛告唆,可吹牛的內容都是我干的。 我是一名探鬼主播晶密,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼擒悬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稻艰?” 一聲冷哼從身側響起懂牧,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尊勿,沒想到半個月后僧凤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡元扔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年躯保,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摇展。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吻氧,死狀恐怖,靈堂內的尸體忽然破棺而出咏连,到底是詐尸還是另有隱情盯孙,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布祟滴,位于F島的核電站振惰,受9級特大地震影響,放射性物質發(fā)生泄漏垄懂。R本人自食惡果不足惜骑晶,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一痛垛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桶蛔,春花似錦匙头、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碟婆,卻和暖如春电抚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竖共。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工蝙叛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人公给。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓借帘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓布。 傳聞我的和親對象是個殘疾皇子姻蚓,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容

  • 減肥不是越減越肥 也不是打魚曬網 從最基本的做起 亦或是暴走 亦或是跳繩 減肥 其實就是堅持 不打魚 不曬網 就是堅持
    擁抱大自然_f8f0閱讀 105評論 0 0
  • 每次都會告訴自己堅持,但是就是沒有堅持下去,我也不知道現(xiàn)在開始堅持寫人生和技術文章能堅持多久,但是愿意歸零,愿意重...
    小白和小黑閱讀 468評論 1 4
  • 一語驚醒夢中的我狰挡。 以前我們只是知道堅持,但是并不懂得堅持释涛,所以經常堅持做一件事情往往沒有達到很好的效果加叁,甚至...
    鐘漢明zZ閱讀 575評論 3 1
  • 一切 都渴望被傾聽 一切 都渴望被愛 因為 聽一您一訴一說 是安靜的體恤 是溫柔的接納 是可以坦然釋放...
    雪莉詩話閱讀 366評論 2 1