URL 強(qiáng)制解包帶來的問題

作者:Erica Sadun酷誓,原文鏈接,原文日期:2017-01-06
譯者:星夜暮晨;校對:Crystal Sun寻定;定稿:CMB

讓我先闡述一下撰寫這篇文章的背景。Laptopmini 想要知道為什么下面這段代碼無法完成編譯精耐。誠然狼速,Swift 的錯誤提示尚存有改進(jìn)的余地。簡而言之:他需要將第二行和第三行代碼進(jìn)行互換卦停,才能夠完成編譯向胡。這就需要讓這兩個屬性在引用 self 之前,完成初始化操作惊完。

我很快將目光放在了這些感嘆號上僵芹。「是否存在會導(dǎo)致 URL 構(gòu)建失敗的情況呢小槐?如果有拇派,為什么不去阻止這些潛在的崩潰發(fā)生呢?」Laptop 指出:他的 URL 在任何情況下都不會發(fā)生異常凿跳,因此在這里使用感嘆號進(jìn)行強(qiáng)制解包是非常安全的件豌。

除此之外,他的這種做法也讓我的代碼潔癖發(fā)作了控嗜。無論如何茧彤,URL 都不應(yīng)該在這個構(gòu)造器當(dāng)中創(chuàng)建。我在想應(yīng)該有更好的方法來進(jìn)行處理疆栏,也就是將 URL 的構(gòu)造從構(gòu)造器當(dāng)中移出曾掂,并且輔以完好的錯誤處理,以便獲得更佳的錯誤消息提示壁顶。

首先珠洗,對 URL 進(jìn)行擴(kuò)展,以提供一個更為安全的非空構(gòu)造器 (non-optional initializer)若专。以下代碼片段提供了「安全著陸」的功效许蓖,當(dāng)某個字符串無法構(gòu)造成 URL 的時候,提供有用的反饋信息。

extension URL {
    /// 非空構(gòu)造器能夠提供更好的錯誤輸出
    public init(safeString string: String) {
        guard let instance = URL(string: string) else {
            fatalError("Unconstructable URL: \(string)")
        }
        self = instance
    }
}

不過對這個問題而言蛔糯,似乎有點小題大做拯腮。因此,我推薦使用這種方案:在 SocketEndPoint 類型當(dāng)中添加相同的方法蚁飒。

// 返回 `URL`动壤,同時也可以明確指出錯誤
public enum SocketEndPoint: String {
    case events = "http://nowhere.com/events"
    case live = "http://nowhere.com/live"
    
    public var url: URL {
        guard let url = URL(string: self.rawValue) else {
            fatalError("Unconstructable URL: \(self.rawValue)")
        }
        return url
    }
}

這種方法使得他的初始化方法更加簡潔明了』绰撸基于這種新的設(shè)計琼懊,我們在構(gòu)造器當(dāng)中使用標(biāo)準(zhǔn)化的 URL,不再使用強(qiáng)制解包爬早。

// 改造過的構(gòu)造器
fileprivate init() {
    self.eventSocket = WebSocket(url: SocketEndPoint.events.url))
    self.liveSocket = WebSocket(url: SocketEndPoint.live.url))
    self.eventSocket.delegate = self
    self.liveSocket.delegate = self
}

總而言之:

  • 字符串枚舉的確很方便哼丈,但是 SocketEndPoint 卻沒有做好它自己的職責(zé)。它的工作應(yīng)該是提供合法的 URL筛严。無論類型實現(xiàn)的方式如何醉旦,它都應(yīng)該提供這樣的功能。物盡其用桨啃,既然在語言內(nèi)部存在一個「差不多」的解決方案车胡,何樂而不為呢?
  • 讓構(gòu)造器保持干凈和整潔照瘾;
  • 在權(quán)衡通用的全局解決方案和簡單的本地解決方案的時候匈棘,有些時候最好從簡單的方案著手,盡量在緊鄰的上下文之間就解決好相關(guān)的問題析命。
  • 我覺得使用正常的 URL 構(gòu)造器(返回有可空值)主卫,然后再創(chuàng)建一個帶有隱式可空值解包(public init(url: URL!))的 WebSocket 構(gòu)造器并沒有帶來任何好處,當(dāng)字符串的結(jié)構(gòu)出現(xiàn)異常的時候鹃愤,就沒有辦法報告這個錯誤簇搅。此外,還十分地丑陋昼浦。

您可以在這個 gist 當(dāng)中看到我所提及的這幾種方法馍资。

本文由 SwiftGG 翻譯組翻譯筒主,已經(jīng)獲得作者翻譯授權(quán)关噪,最新文章請訪問 http://swift.gg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乌妙,一起剝皮案震驚了整個濱河市使兔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藤韵,老刑警劉巖虐沥,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡欲险,警方通過查閱死者的電腦和手機(jī)镐依,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來天试,“玉大人槐壳,你說我怎么就攤上這事∠裁浚” “怎么了务唐?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長带兜。 經(jīng)常有香客問我枫笛,道長,這世上最難降的妖魔是什么刚照? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任刑巧,我火速辦了婚禮,結(jié)果婚禮上无畔,老公的妹妹穿的比我還像新娘瑰谜。我一直安慰自己扔涧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镜悉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殷勘。 梳的紋絲不亂的頭發(fā)上况鸣,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音饵较,去河邊找鬼拍嵌。 笑死,一個胖子當(dāng)著我的面吹牛循诉,可吹牛的內(nèi)容都是我干的横辆。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼茄猫,長吁一口氣:“原來是場噩夢啊……” “哼狈蚤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起划纽,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤脆侮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勇劣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靖避,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡潭枣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幻捏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆犁。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖篡九,靈堂內(nèi)的尸體忽然破棺而出蚣抗,到底是詐尸還是另有隱情,我是刑警寧澤瓮下,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布翰铡,位于F島的核電站,受9級特大地震影響讽坏,放射性物質(zhì)發(fā)生泄漏锭魔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一路呜、第九天 我趴在偏房一處隱蔽的房頂上張望迷捧。 院中可真熱鬧,春花似錦胀葱、人聲如沸漠秋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庆锦。三九已至,卻和暖如春轧葛,著一層夾襖步出監(jiān)牢的瞬間搂抒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工尿扯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留求晶,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓衷笋,卻偏偏與公主長得像芳杏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辟宗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理爵赵,服務(wù)發(fā)現(xiàn),斷路器慢蜓,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法亚再,類相關(guān)的語法郭膛,內(nèi)部類的語法晨抡,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,870評論 25 707
  • 文集目錄:《水滸》里的小山頭 早幾年前镜遣,我寫了一篇幾千字的文,簡單閑談了下水滸里的主角人物士袄,也就是宋江悲关、武松、林沖...
    魔鬼的贊歌閱讀 4,840評論 1 15
  • 俗話說人多力量大娄柳,都團(tuán)結(jié)一致寓辱,朝一個目標(biāo),結(jié)果肯定是好的赤拒。如每個人都有自己的想法秫筏,再多的人也沒有力量。有時候不能定...
    孫倩倩Rela閱讀 121評論 0 0