阅读前了解知识点
泛型文档中文版
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类型值
}
}