天天看點

Swift typealias使用

閱讀前了解知識點

泛型文檔中文版

Swift改變日志,搜尋關鍵字typealias

typealias

typealias是指類型别名,将一個已存在的類型别名一個其他名字,比如:

// 我經常幹的
typealias NetParams = [String: Any]  /// 網絡請求參數
// 系統Core Location 的經緯度類型
public typealias CLLocationDegrees = Double
           

這樣做的好處:

  • 很好的辨別業務,而不僅僅是全篇的基本類型。比如我的NetParams 一看就知道用于網絡請求傳參,看見TimeInterval就知道這個值與時間戳有關系。
  • 友善統一類型管理, 比如定義定義屬性 var orderId: Int, 後期發現可能存在越界,又改為Sting,如果定義别名類型,就很友善更改。
  • 待補充

typealias 常用指南

已有參數業務化别名

就像這個:

typealias name = existing type
// 我經常幹的
typealias NetParams = [String: Any]  /// 網絡請求參數
// 系統Core Location 的經緯度類型
public typealias CLLocationDegrees = Double
typealias CellItme = (title: String, content: String)
           

條件編譯

開源架構多平台統一類型, 或者條件編譯統一類型。比如:

#if os(OSX)
  typealias SKColor = NSColor
#elseif os(iOS)
  typealias SKColor = UIColor
#else
  typealias SKColor = Green
#endif
           

就統一了顔色。不用每個地方都用條件編譯。

協定關聯類型(swift2.2之前)

swift2.2之前

protocol RawRepresentable {
  typealias RawType
  static func fromRaw(raw: RawType) -> Self?
  func toRaw() -> RawType
}
           

swift2.2之後,使用

associatedtype

protocol P {
  associatedtype Ty
}
           

别名泛型類型

Swift3之後就可以為 帶有泛型的類型 别名。

typealias StringDictionary<T> = Dictionary<String, T>
typealias IntFunction<T> = (T) -> Int
typealias MatchingTriple<T> = (T, T, T)
typealias BackwardTriple<T1, T2, T3> = (T3, T2, T1)
           

閉包定義

建議使用别名定義閉包,減少代碼長度,友善閱讀。

typealias CompletionHandler =
   (token: Token, error: Error?) -> Void   // error: function types cannot have argument labels

typealias CompletionHandler =
   (_ token: Token, _ error: Error?) -> Void   // okay: names are for documentation purposes
           

Swift5.1也支援自動閉包使用别名定義了【自動閉包:不帶參數,有傳回值,調用才傳回值】

class Foo {
  typealias FooClosure = () -> String  // 别名自動閉包
  func fooFunction(closure: @autoclosure FooClosure) {}
}
           

在泛型的結構體和類中使用

友情提示:RxSwift架構中使用了大量的

typealias

泛型,可以去看看。

聲明某個泛型類的時候,可以用

typealias

來統一内部的泛型

// 轉換類型
struct Transformer<Old,New> {
    typealias O = Old
    typealias N = New
    let closure: (O) -> N
    func transformed(value old: O) -> N {
        return closure(old)
    }
    /// 類方法中使用
    static func staticMethod(value: Transformer<Old,New>.O) -> Transformer<Old, New>.N {
        ...
        return N類型值
    }
}
           

繼續閱讀