协议中的自我总是需要是可选的?

Self in protocol always need to be optional?

示例:

internal protocol PropertyProtocol {
    var property: Self {
        get
    }
}

我认为实现它的唯一选择,让我们在 class 中说是

internal final class PropertyClass: PropertyProtocol {
    let property: PropertyClass

    internal init(otherOne pOtherOne: PropertyClass) {
        self.property = pOtherOne
    }
}

但后来我看不到使用它的可能性。

let test: PropertyProtocol = PropertyProtocol(...) // hmm, how?

协议中的 Self 属性 类型声明是否始终必须是可选的?

作为存储的 属性,实际上创建实例必须是可选的,因为每个实例都需要在初始化期间分配存储的 属性 – 导致递归行为.因此 Self 作为存储的 属性 没有太大意义;它实际上更适合与方法或计算属性一起使用。

根据您使用它的目的(似乎是一个相当假设的示例),您可以像这样实现计算的 属性:

protocol PropertyProtocol {
    var property : Self { get }
}

final class PropertyClass : PropertyProtocol {
    var property : PropertyClass {
        get {
            return // ...
        }
        set {
            // ...
        }
    }
}

这样 class 本身就可以在访问时管理 属性 的创建,从而防止在初始化期间要求分配它的递归行为。