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

时间:2016-06-06 10:02:04

标签: swift properties swift-protocols

示例:

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

我看到实现它的唯一选择,让我们在课堂上说

internal final class PropertyClass: PropertyProtocol {
    let property: PropertyClass

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

但是我没有看到使用它的可能性。

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

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

1 个答案:

答案 0 :(得分:1)

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

根据您使用此功能(看起来是一个相当假设的示例),您可以实现如下计算属性:

protocol PropertyProtocol {
    var property : Self { get }
}

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

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