本篇分為兩部分: 在 Swift 中,AnyObject 可以代表任何 class 類型的實例,Any 可以表示任意類型,包括方法(func)類型,相當於 OC 中的 id。因為 id 可以為空,所以 AnyObject 也是Optional類型的。 驗證 Any 和 AnyObject 的特性:
本篇分為兩部分:
一、Swift中的Any和AnyObject
二、Swift中的typealias和泛型介面
一、Swift中的Any和AnyObject
在 Swift 中,AnyObject 可以代表任何 class 類型的實例,Any 可以表示任意類型,包括方法(func)類型,相當於 OC 中的 id。因為 id 可以為空,所以 AnyObject 也是Optional類型的。
驗證 Any 和 AnyObject 的特性:
import UIKit let swiftInt: Int = 1 let swiftString: String = "miao" var array: [AnyObject] = [] array.append(swiftInt) array.append(swiftString)
數組 array 中的情況:
我們這裡生命了一個 Int 和一個 String 類型的常量,按理說他們只能被 Any 代表,而不能被 AnyObject 代碼,但是編譯運行可以通過。這是因為在 Swift 和 Cocoa 中的這幾個對應的類型是可以進行自動轉換的。如果對性能要求高還是儘量使用原生的類型。在變成過程中還是儘量明確數據類型,少用 AnyObject。
二、Swift中的typealias和泛型介面
在 Swift 中是沒有泛型介面的,但是使用 typealias 可以在介面里定義一個必須實現的別名。
class Person<T> {} typealias WorkId = String typealias Worker = Person<WorkId> protocol GeneratorType { typealias Element mutating func next() -> Self.Element? } protocol SequenceType { typealias Generator : GeneratorType func generate() -> Self.Generator }
正常情況下,我們的代碼是這樣的:
func distanceBetweenPoint(point: CGPoint, toPoint: CGPoint) -> Double { let dx = Double(toPoint.x - point.x) let dy = Double(toPoint.y - point.y) return sqrt(dx * dx + dy * dy) } let origin: CGPoint = CGPoint(x: 0, y: 0) let point: CGPoint = CGPoint(x: 1, y: 1) let distance: Double = distanceBetweenPoint(origin, toPoint: point)
利用 typealias 之後將會大大提高我們代碼的閱讀性:
typealias Location = CGPoint typealias Distance = Double func distanceBetweenPoint(location: Location, toLocation: Location) -> Distance { let dx = Distance(location.x - toLocation.x) let dy = Distance(location.y - toLocation.y) return sqrt(dx * dx + dy * dy) } let originP: Location = Location(x: 0, y: 0) let pointP: Location = Location(x: 1, y: 1) let distanceD: Distance = distanceBetweenPoint(origin, toLocation: point)