英語原文地址:Typealias usage in Swift - SwiftLee
Swift 中的typealias
實際上是現有類型的別名。很簡單,不是嗎?它們可以使您的代碼更具可讀性。通過以一種聰明的方式使用它們,它們在您的代碼庫中會非常有用。
聲明類型別名
可以在 Swift 中使用typealias
關鍵字和要分配的類型聲明typealias
。理解如何使用它們的一個非常簡單的示例是爲貨幣(如美元)創建別名。以收據結構的以下示例爲例:
struct Receipt {
let totalCosts: Double
}
由於類型只是“雙精度”,我們現在還沒有真正確定總成本。我們可以通過聲明類型別名來提高可讀性:
typealias Dollar = Double
這給了收據結構更多的上下文,並提高了可讀性:
struct Receipt {
let totalCosts: Dollar
}
類型別名可以是創建自定義類或子類的簡單替代方法。
typealias
是新類型嗎?
不,基本上,它只是現有類型的命名別名。我們的Dollar
別名只是一個Double
具有不同名稱的,因此可以與完全相同地使用Double
。
反之亦然。如果要爲類型別名創建擴展名,則基本上是爲其基礎類型創建擴展名。以下示例顯示toEuro()
了我們Dollar
和Double value
都可以使用的方法。
typealias Dollar = Double
typealias Euro = Double
struct Receipt {
let totalCosts: Dollar
}
extension Dollar {
func toEuro() -> Euro {
return self * 0.896
}
}
let receipt = Receipt(totalCosts: 10)
receipt.totalCosts.toEuro() // 8.96
let doubleNumber: Double = 10
doubleNumber.toEuro() // 8.96
與泛型結合
泛型也可以與類型別名結合使用。例如,我們可以使用新的Swift Result
類型來創建交換結果類型。這可以進一步提高我們的可讀性:
typealias Dollar = Double
typealias Euro = Double
struct Receipt {
let totalCosts: Dollar
}
typealias Currency = Double
typealias ExchangeResult<Currency> = Result<Currency, Error>
enum ExchangeError: Error {
case invalidInput
}
extension Dollar {
func toEuro() -> ExchangeResult<Euro> {
guard self > 0 else {
return ExchangeResult.failure(ExchangeError.invalidInput)
}
return Result.success(self * 0.896)
}
}
let receipt = Receipt(totalCosts: 10)
receipt.totalCosts.toEuro() // .success(8.96)
let doubleNumber: Double = 10
doubleNumber.toEuro() // .success(8.96)
其他有價值的用法示例
在項目中經常使用typealias
作爲輕鬆重用完成回調的一種方式:
typealias Completion = () -> Void
使委託符合多種類型:
typealias TransitionDelegate = UIViewController & UIViewControllerTransitioningDelegate
或者,爲在多個地方使用的字典制作一個簡單的別名:
/// A dictionary containing properties to send with the tracking operation
public typealias TrackingProperties = [String: Any]
結論
如您所見,類型別名對於提高整個代碼庫的可讀性很有用。看看它可以爲您的項目做什麼,並嘗試使您的代碼自我記錄。
謝謝!