Protocols
昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/Protocols.html を読む。
protocol
は 他の宣言の内側にネストできないextension
と同じファイルスコープ、なのにエラーメッセージが違うのはなぜだ- プロパティはインスタンスと型を要求できる。格納型か計算型かどうかは指定できない。名前と型だけ
- 読み取り専用か、読み書き可能かは指定できる
- プロトコルが読み書き可能を要件したら、定数格納プロパティや読み取り専用計算プロパティでは要件を満たせない
- 読み取り専用なら、どんな形式のプロパティでも満たせる
- プロトコルでは
var
キーワード 読み書き可能は{ get set }
読み取り専用は{ get }
- 型プロパティ・型メソッドはプロトコルでは
static
でも、クラスではclass
宣言できる - こんなところで "John Appleseed"
- インスタンスメソッドと型メソッドを要求できる
- 可変引数できる。パラメータのデフォルト値は、プロトコルの定義ではできない
- プロトコルで
mutating
メソッドは構造体と列挙型でのみ使われる クラスの実装ではmutating
不要 - 指定イニシャライザ または 便利イニシャライザ のどちらも
- プロトコルでイニシャライザを要求したら、実装では
required
修飾子をつけてrequired init(〜) {…}
final
クラスではrequired
修飾子は要らない。なぜならfinal
クラスはサブクラス化できないから- プロトコルでfailableなイニシャライザを要求したら、実装はfailableでもnonfailableでもどっちでも要件を満たす
- プロトコルでnonfailableなイニシャライザを要求したら、実装はnonfailableなイニシャライザか、暗黙にunwrapするfailableなイニシャライザが要件を満たす
- プロトコルで要件したイニシャライザを実装したクラスから派生したサブクラスでoverrideしたら
required override init(〜)
- delegateなパターンは弱参照で
weak var delegate: XxxxDelegate?
- プロトコルのコンポジション
ProtocolA & ProtocolB
- プロトコルをconformしてるかどうかは
is
キャストはas?
かas!
で - プロトコル定義でオプショナルな要求は
optional
修飾子をつけて - オプショナルな要求は Objective-C との相互運用でavailableなので
@objc
属性をつけて - オプショナルな要求は 構造体と列挙型には適合できない
- オプショナルな要求は Optionalな型になるので、使うときは
?
をつけてopttional-chaining - 型のextensionで、型にprotocolをconform
- プロトコルのextensionで、メソッドをデフォルト実装
- プロトコルのextensionで、制約
extension Collection where Element: Equatable {…}