Swift - 關鍵字(typealias、associatedtype)
阿新 • • 發佈:2018-05-29
cell 是什麽 eth ucc 定義 truct 幫助 rip too
[javascript] view plain copy
Typealias
typealias 是用來為已經存在的類型重新定義名字的,通過命名,可以使代碼變得更加清晰。使用的語法也很簡單,使用typealias 關鍵字像使用普通的賦值語句一樣,可以將某個已經存在的類型賦值為新的名字。比如在計算二維平面上的距離和位置的時候,我們一般使用Double來表示距離,用CGPoint來表示位置:[javascript] view plain copy
- func distance(_ point: CGPoint, _ anotherPoint: CGPoint) -> Double {
- let dx = Double(anotherPoint.x - point.x)
- let dy = Double(anotherPoint.y - point.y)
- return sqrt(dx * dx + dy * dy)
- }
- let origin = CGPoint(x: 3, y: 0)
- let point = CGPoint(x: 4, y: 0)
- let d = distance(origin, point)
- func distance(_ point: CGPoint, _ anotherPoint: CGPoint) -> Double {
- let dx = Distance(anotherPoint.x - point.x)
- let dy = Distance(anotherPoint.y - point.y)
- return sqrt(dx * dx + dy * dy)
- }
- let origin = Location(x: 3, y: 0)
- let point = Location(x: 4, y: 0)
- let d = distance(origin, point)
[javascript] view plain copy
- typealias Success = (_ data: String) -> Void
- typealias Failure = (_ error: String) -> Void
- func request(_ url: String, success: Success, failure: Failure) {
- // do request here ....
- }
typealias與泛型
typealias 是單一的,也就是說你必須指定將某個特定的類型通過typealias賦值為新名字,而不能將整個泛型類型進行重命名。下面這樣的命名都是無法通過編譯的:[javascript] view plain copy
- class Person<T> {}
- typealias Woker = Person
- typealias Worker = Person<T>
- class Person<T> {}
- typealias Woker = Person
- typealias Worker<T> = Person<T>
[javascript] view plain copy
- class Person<T> {}
- typealias WorkId = String
- typealias Worker = Person<WorkId>
[javascript] view plain copy
- protocol Cat {}
- protocol Dog {}
- typealias Pat = Cat & Dog
associatedtype關聯類型
定義一個協議時,有的時候聲明一個或多個關聯類型作為協議定義的一部分將會非常有用。關聯類型為協議中的某個類型提供了一個占位名(或者說別名),其代表的實際類型在協議被采納時才會被指定。你可以通過 associatedtype 關鍵字來指定關聯類型。比如使用協議聲明更新cell的方法:[javascript] view plain copy
- //模型
- struct Model {
- let age: Int
- }
- //協議,使用關聯類型
- protocol TableViewCell {
- associatedtype T
- func updateCell(_ data: T)
- }
- //遵守TableViewCell
- class MyTableViewCell: UITableViewCell, TableViewCell {
- typealias T = Model
- func updateCell(_ data: Model) {
- // do something ...
- }
- }
Swift - 關鍵字(typealias、associatedtype)