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 {…}