属性要求

<aside> 🍥 协议中的属性会指明是类型属性还是实例属性,以及属性是只读的还是可读可写的,但协议不会规定属性是存储属性还是计算属性。

</aside>

<aside> 🍥 如果协议要求属性是可读可写的,那么属性不能是常量属性或只读的计算属性,但如果协议要求属性是只读的,那么属性不仅可以是只读的,也可以是可写的。此时,外部可修改该属性的值。

</aside>

<aside> 🍥 协议总是用 var 来声明属性。

</aside>

protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}

<aside> 🍥 在协议中,类型属性前使用 static 关键字,但在类中实现的时候,可以使用 static 或者 class

</aside>

构造器要求

协议构造器的类实现

在协议中的声明:

protocol SomeProtocol {
    init(someParameter: Int)
}

<aside> 🍥 protocol 中的构造器在类中的实现无论是指定构造器还是遍历构造器,都需要在前面加上 required 关键字。使用 required 关键字可以确保所有子类也必须提供该构造器的实现,从而也能遵循协议。

</aside>

<aside> 🌻 被标记为 required 的构造器意味着子类必须实现该构造器,子类也需要被标记为 required 来将这个要求传递下去,但是子类不需要在这样的构造器前标记 override

</aside>

class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        // 这里是构造器的实现部分
    }
}

<aside> 🍼 extension 可以为类添加便利构造器,但不可添加指定构造器和析构器。

</aside>

<aside> 🍥 extension 只能添加便利构造器,而 protocol 则指定和便利构造器都可。

</aside>

<aside> 🍥 如果一个类已经被标记为 final,则实现协议中的构造器时,无需添加 required 标记,因为这个类已经不可重写。

</aside>