自我协议的行为

ABa*_*ith 9 generics protocols swift

我最近在Swift中阅读了Protocols,Generic Type Constraints和Arrays.我的问题涉及博客中的以下两个例子:

代码:

protocol MyProtocol1 {
    var myValue: Self { get }
}

let array: [MyProtocol1] = []  // Error.
Run Code Online (Sandbox Code Playgroud)

产生错误:

协议"MyProtocol1"只能用作通用约束,因为它具有Self或关联类型要求.

这是预期的,并且有关于该主题的几个SO问题.但是,通过更改myValue为函数,不再有任何错误,但在这两种情况下Self都会返回.

protocol MyProtocol2 {
    func myValue() -> Self
}

let array: [MyProtocol2] = []  // This is okay.
Run Code Online (Sandbox Code Playgroud)

有谁知道这个看似奇怪的行为的原因?

Abd*_*lah 0

我对此没有明确的答案,但我觉得这可能是由于班级规模和内部布局所致。

拥有关联类型或 Self 类型成员将影响对象的大小,从而影响数组大小,但使用 Self 作为方法返回类型将影响对象大小。