Swift 关联(typealias)类型和Self-in协议如何工作?

Swift 关联(typealias)类型和Self-in协议如何工作?,swift,protocols,type-alias,Swift,Protocols,Type Alias,对不起,我是一个编程新手,我试图表达我想问的问题。请原谅我。 我在协议中看到过类似的情况 protocol Pro1 { typealias Element // ... } protocol Pro2: Pro1 { typealias Element = Self // ... } 元素在协议中,该元素是否相互关联 我不明白下面的表达是什么意思: typealias Element = Self 非常感谢。Pro1 写这个 protocol Pro1 {

对不起,我是一个编程新手,我试图表达我想问的问题。请原谅我。 我在协议中看到过类似的情况

protocol Pro1 {
    typealias Element
    // ...
}
protocol Pro2: Pro1 {
    typealias Element = Self
    // ...
}
元素
在协议中,该
元素
是否相互关联

我不明白下面的表达是什么意思:

typealias Element = Self
非常感谢。

Pro1 写这个

protocol Pro1 {
    typealias Element
}
您只是告诉我们将有一个名为
Element
的类型

Pro2 加上这个

protocol Pro2: Pro1 {
    typealias Element = Self
}
您告诉编译器,
元素
将与实现
Pro2
的类型相同

是的,在
Pro1
Pro2
中的
元素之间存在一种关系

向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

    }
}
class Boo: Pro2 {
    func a() -> Boo {
        return Boo()
    }
    func b(elm: Boo) {

    }
}