<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>