Swift 進(jìn)階筆記-業(yè)務(wù)化 Tips(1)-哈希

本主題旨在自己學(xué)習(xí)的過(guò)程中舉出實(shí)例業(yè)務(wù)項(xiàng)目片段幫助自己提高靈性界赔,深入領(lǐng)會(huì)知識(shí)概念,記作學(xué)習(xí)拓展筆記。希望在有幸被您看到文章的同時(shí)為您帶來(lái)更多啟示设捐。

Hashable

如果我們想要將自定義結(jié)構(gòu)體、類儲(chǔ)存在 Set 中塘淑,或是將其作為 Dictionary 的鍵值 Key萝招,可以繼承 Hashable 并實(shí)現(xiàn)需要實(shí)現(xiàn)的內(nèi)容。
例如實(shí)現(xiàn):自定義多選 UI存捺,選出去過(guò)的城市槐沼,將選中的城市存儲(chǔ)在集合中。


效果.gif

先上Demo:
https://github.com/wiiale/AdvancedSwiftThinker/tree/master/T01-Hashable-Footprint

這里為了保持簡(jiǎn)單捌治,直接tableView.reloadData()了岗钩,也可以添加漂亮的 UI、動(dòng)畫(huà)效果來(lái)自定義的更加明顯肖油。

實(shí)現(xiàn)代碼中主要與 Hasable 相關(guān)模塊

實(shí)現(xiàn)
// City.swift

struct City {
    let name: String
    let province: String
}

extension City: Hashable {
    var hashValue: Int {
        get {
            return "\(name)\(province)".hashValue
        }
    }
    
    static func ==(lhs: City, rhs: City) -> Bool {
        return lhs.name == rhs.name
    }
}
使用

Set<City>: City 需要實(shí)現(xiàn)Hashable才能存儲(chǔ)在集合 Set 中兼吓。

// TableViewDataSource.swift
import UIKit

class TableViewControllerDataSource: NSObject, UITableViewDataSource {
    var cities: [City]
    // Set<City>
    var selectedCitiesSet: Set<City>
    weak var owner: TableViewController?
    
    init(cities: [City], selectedCitiesSet: Set<City>, owner: TableViewController?) {
        self.cities = cities
        self.selectedCitiesSet = selectedCitiesSet
        self.owner = owner
    }

    ···
}

狀態(tài)改變時(shí),是否相等的比較避免不必要的狀態(tài)更新森枪,同時(shí)用到了實(shí)現(xiàn) Hashable 時(shí)需要實(shí)現(xiàn) Equatable 的重載==操作符來(lái)進(jìn)行判等操作视搏。對(duì)于元素類型實(shí)現(xiàn)了 Equatable 協(xié)議的數(shù)組,也可以直接使用contains方法會(huì)查看數(shù)組是否包含滿足給定的謂詞條件的元素等操作疲恢。

TableViewController.swift
func stateDidChanged(state: State, previousState: State?, command: Command?) {
    if let command = command, case .loadCities(let handler) = command {
        CityStore.shared.getCities(completionHandler: handler)
    }
    
    // 判等
    if previousState == nil
        || previousState!.dataSource.cities != state.dataSource.cities
        || previousState!.dataSource.selectedCitiesSet != state.dataSource.selectedCitiesSet
    {
        tableView.dataSource = state.dataSource
        tableView.reloadData()
    }
}
注意點(diǎn)(1)-避免哈希碰撞

如果用不太穩(wěn)妥的方式實(shí)現(xiàn) hashValue 則會(huì)導(dǎo)致哈希碰撞凶朗,需要注意 hashValue 的實(shí)現(xiàn)方式。錯(cuò)誤示例:

var hashValue: Int {
    get {
        return name.hashValue ^ province.hashValue
    }
}
City(name: "Shanghai", province: "Shanghai").hashValue // 0
City(name: "Beijing",  province: "Beijing") .hashValue // 0
City(name: "Hangzhou", province: "Zhejiang").hashValue // 6535861917244346740
City(name: "Zhejiang", province: "Hangzhou").hashValue // 6535861917244346740
注意點(diǎn)(2)-繼承 NSObject 的類

NSObject 已繼承 Equatable, Hashable显拳,存在方法 isEqual棚愤,不需要重載==運(yùn)算符。

class CityObj: NSObject { ··· }
extension CityObj {
    override var hashValue: Int {
        get {
            return "\(name)\(province)".hashValue
        }
    }
    
    override func isEqual(_ object: Any?) -> Bool {
        return name == (object as? CityObj)?.name
    }
}

本文 ViewController 學(xué)習(xí)并嘗試單向數(shù)據(jù)流動(dòng)的方式編寫(xiě)杂数,參考自喵神的單向數(shù)據(jù)流動(dòng)的函數(shù)式 View Controller

文章Demo 匯總:
https://github.com/wiiale/AdvancedSwiftThinker

本冊(cè)文集中以“提出簡(jiǎn)單需求->簡(jiǎn)單實(shí)現(xiàn)需求片段”為流程宛畦,內(nèi)容只針對(duì)該知識(shí)點(diǎn)實(shí)現(xiàn)的業(yè)務(wù)實(shí)例進(jìn)行熟悉,業(yè)務(wù)也必定存在比文章方法更好的實(shí)現(xiàn)方式揍移,文章旨在分析知識(shí)點(diǎn)并加深理解次和。文集不普及基本知識(shí),不包含《Swift 進(jìn)階》書(shū)籍的詳細(xì)內(nèi)容那伐。深入學(xué)習(xí)Swift請(qǐng)大家支持正版書(shū)籍(ObjC 中國(guó))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踏施,一起剝皮案震驚了整個(gè)濱河市石蔗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畅形,老刑警劉巖养距,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異日熬,居然都是意外死亡棍厌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門竖席,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耘纱,“玉大人,你說(shuō)我怎么就攤上這事毕荐∈觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵东跪,是天一觀的道長(zhǎng)畸陡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虽填,這世上最難降的妖魔是什么丁恭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮斋日,結(jié)果婚禮上牲览,老公的妹妹穿的比我還像新娘。我一直安慰自己恶守,他們只是感情好第献,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著兔港,像睡著了一般庸毫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衫樊,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天飒赃,我揣著相機(jī)與錄音,去河邊找鬼科侈。 笑死载佳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臀栈。 我是一名探鬼主播蔫慧,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼权薯!你這毒婦竟也來(lái)了姑躲?” 一聲冷哼從身側(cè)響起睡扬,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肋联,沒(méi)想到半個(gè)月后威蕉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刁俭,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡橄仍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牍戚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侮繁。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖如孝,靈堂內(nèi)的尸體忽然破棺而出宪哩,到底是詐尸還是另有隱情,我是刑警寧澤第晰,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布锁孟,位于F島的核電站,受9級(jí)特大地震影響茁瘦,放射性物質(zhì)發(fā)生泄漏品抽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一甜熔、第九天 我趴在偏房一處隱蔽的房頂上張望圆恤。 院中可真熱鬧,春花似錦腔稀、人聲如沸盆昙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淡喜。三九已至,卻和暖如春诵闭,著一層夾襖步出監(jiān)牢的瞬間炼团,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工涂圆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留们镜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓润歉,卻偏偏與公主長(zhǎng)得像模狭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踩衩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349