Swift 圣戰(zhàn):類型別名

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評論 25 709
  • 本文系轉(zhuǎn)載,原文鏈接,本文是哥目前看到的關于 swift的枚舉的最最詳盡(雖然我也沒看過多少技術文章??????,lo...
    小白猿閱讀 812評論 0 1
  • 首先需要說明清楚的是,并不是遇到block捕獲引用就得用上weak-strong Dance,只有在出現(xiàn)循環(huán)引用...
    samingzhong閱讀 538評論 6 1
  • 今日透析。 早上八點起床,做完晨練,敷了胳膊,搽好喜遼妥,將洗衣機內(nèi)洗凈的衣物晾好,很快就到了九點半,步行出發(fā)去醫(yī)...
    小棕櫚閱讀 240評論 0 0

友情鏈接更多精彩內(nèi)容