英语原文地址: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]
如您所见,类型别名对于提高整个代码库的可读性很有用。看看它可以为您的项目做什么,并尝试使您的代码自我记录。
谢谢!