閱讀前了解知識點
泛型文檔中文版
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類型值
}
}