作者: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。