作者:Erica Sadun,原文鏈接,原文日期:2017-01-09
譯者:星夜暮晨;校對:Crystal Sun;定稿:CMB
Kyle Cardoza 留言給我:「Erica,當您必須處理指向不同類型的 OpaquePointer 值時,為 OpaquePointer 建立一個別名是否是糟糕的代碼風格呢?我覺得類型別名讓代碼讀起來更舒服……」。
使用類型別名來創(chuàng)建「假型 (pseudotypes)」(而通常類型別名只會重復表述一個類型),可以用來整齊地組織代碼。我贊成任何可以強化語義表述和加強可讀性的方案。由于 OpaquePointer 并不是泛型,因此我們沒辦法像 Array<Int> 或者 Set<String> 那樣來封裝類型的信息。
// 兩者的類型都是 `OpaquePointer`,因此沒有辦法能具體區(qū)分這兩者
let p1 = OpaquePointer(unsafeMutableRawPtr1)
let p2 = OpaquePointer(unsafeMutableRawPtr2)
構建便利類型別名 (convenience typealias) 可以強調(diào)出結構相同、但用法不同的類型之間的區(qū)別。這可以區(qū)分每個使用點的具體類型,并且提供了內(nèi)置的「類型注解 (type commentary)」。
typealias OpaqueType1Pointer = OpaquePointer
typealias OpaqueType2Pointer = OpaquePointer
let p1: OpaqueType1Pointer = OpaquePointer(rawPtr1)
let p2: OpaqueType2Pointer = OpaquePointer(rawPtr2)
然而,您可能還會考慮其他的替代方案。如果您打算減少一些類型安全增強方面的開銷,那么可以考慮引入一個簡單的值類型,將 OpaquePointer 封裝起來,就能夠使用特定類型的構造器來完成構造了。這里有一個非常粗略的示例:
struct SometypeWrapper {
let opaque: OpaquePointer
init(value: Sometype) {
opaque = OpaquePointer(Unmanaged.passRetained(value).toOpaque())
}
}
你怎么看?類型別名是一個好的選擇嗎?或者是一個糟糕的做法呢?還是需要構建一個封裝呢?請告知您的看法,可以在留言區(qū)評論,或者給我發(fā) tweet。
感謝 Mike Ash 的幫助。
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權,最新文章請訪問 http://swift.gg。