实际上,毫无疑问,为 -let's say- String: typealias MyString = String 创建一个类型别名不会那么有用,(我还假设为具有特定键/值类型的 Dictionary 声明一个类型别名:@987654324 @ 可能对你没那么有用。
但是,当涉及到使用 compound types 时,您肯定会注意到类型别名的好处。
示例:
假设您正在实现管理器,该管理器在其函数中重复使用带有许多参数的闭包:
class MyManager {
//...
func foo(success: (_ data: Data, _ message: String, _ status: Int, _ isEnabled: Bool) -> (), failure: (_ error: Error, _ message: String, _ workaround: AnyObject) -> ()) {
if isSuccess {
success(..., ..., ..., ...)
} else {
failure(..., ..., ...)
}
}
func bar(success: (_ data: Data, _ message: String, _ status: Int, _ isEnabled: Bool) -> (), failure: (_ error: Error, _ message: String, _ workaround: AnyObject) -> ()) {
if isSuccess {
success(..., ..., ..., ...)
} else {
failure(..., ..., ...)
}
}
// ...
}
如您所见,方法签名看起来真的乏味!这两种方法都采用success 和failure 参数,每一个都是带参数的闭包;此外,为了实现类似的功能,保持复制粘贴参数是不合逻辑的。
在这种情况下实施typealias 非常合适:
class MyManager {
//...
typealias Success = (_ data: Data, _ message: String, _ status: Int, _ isEnabled: Bool) -> ()
typealias Failure = (_ error: Error, _ message: String, _ workaround: AnyObject) -> ()
func foo(success: Success, failure: Failure) {
if isSuccess {
success(..., ..., ..., ...)
} else {
failure(..., ..., ...)
}
}
func bar(success: Success, failure: Failure) {
if isSuccess {
success(..., ..., ..., ...)
} else {
failure(..., ..., ...)
}
}
// ...
}
因此它会更具表现力和可读性。
此外,您可能想查看我发布的medium story。