专业版1
写这个
protocol Pro1 {
typealias Element
}
你只是说会有一个名为Element的类型。
专业版2
添加这个
protocol Pro2: Pro1 {
typealias Element = Self
}
您告诉编译器Element 将与实现Pro2 的类型相同。
所以是的,Pro1 和 Pro2 中的 Element 之间存在关系。
向 Pro1 添加方法
让我们在Pro1 中声明两个将使用Element 的方法
protocol Pro1 {
typealias Element
func a() -> Element
func b(elm: Element)
}
符合 Pro1
现在符合Pro1 的类将是这样的。
class Foo: Pro1 {
func a() -> String {
return ""
}
func b(elm: String) {
}
}
如您所见,编译器强制我们将a 的返回类型和b 的参数设置为相同类型。
符合 Pro2
现在让我们尝试使另一个类符合 Pro2。同样Pro1 将强制我们声明方法a 和b,其中a 的返回类型等于b 的参数。
此外Pro2 将强制我们将此类型设置为等于当前类型Boo 的类型。
所以上一个类将符合Pro2,因为String与Foo不同
class Foo: Pro2 {
func a() -> String { // <- compiler error
return ""
}
func b(elm: String) { // <- compiler error
}
}
但是,如果我们声明一个新类并将Element 替换为Boo,它将起作用,因为这两个协议的约束都得到了满足。
class Boo: Pro2 {
func a() -> Boo {
return Boo()
}
func b(elm: Boo) {
}
}