1、typealias和泛型接口
2、泛型扩展
1、typealias和泛型接口
- typealias是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。
- typealias是单一的,也就是说你必须指定将某个特定的类型通过typealias赋值为新名字,而不能将整个泛型类型进行重命名。下面这样的命名都是无法通过编译的:
class Person<T> {}
typealias Worker = Person
typealias Worker = Person<T>
typealias Worker<T> = Person<T>
- 一旦泛型类型的确定性得到保证后,我们就可以重命名了“
class Person<T> {}
typealias WorkId = String
typealias Worker = Person<WorkId>
- Swift中没有泛型接口的,但是使用typealias,我们可以在接口里定义一个必须实现的别名,这在一定范围内也算一种折中方案。
protocol GeneratorType {
typealias Element
mutating func next() --> Self.Element?
}
protocol SequenceType {
typealias Generator: GeneratorType
func generate() —> Self.Generator
}
在实现这些接口时,我们不仅需要实现指定的方法,还要实现对应的typealias,这其实是一种对于接口适用范围的抽象和约束。
2、泛型扩展
- Swift对于泛型的支持使得我们可以避免为类似的功能多次书写重复的代码,这是一种很好的简化。
- 在泛型类型的extension中可以直接使用之前定义的泛型的名称,在extension的方法中可以定义新的泛型名称。
- 简单说就是我们不能通过扩展来重新定义当前已有的泛型符号,但是可以对其进行使用;在扩展中也不能为这个类型添加泛型符号;但只要名字不冲突,我们是可以再新声明的方法中定义和使用新的泛型符号的。
网友评论