web-dev-qa-db-ja.com

Swiftクラスにネストされたプロトコル

次のようなデリゲートパターンを実装するために、クラスにプロトコルをネストしたいと思います。

class MyViewController : UIViewController {

    protocol Delegate {
        func eventHappened()
    }

    var delegate:MyViewController.Delegate?

    private func myFunc() {
        delegate?.eventHappened()
    }
}

しかし、コンパイラはそれを許可しません:

プロトコル「デリゲート」を別の宣言内にネストすることはできません

クラススコープの外でMyViewControllerDelegateを宣言することで、簡単に機能させることができます。
私の質問はなぜそのような制限ですか?

15
Axel Guilmin

Swift documenation によると

Swiftを使用すると、ネストされた型を定義できます。これにより、サポートする列挙、クラス、および構造を、それらがサポートする型の定義内にネストできます。

プロトコルがそのリストにない場合、現在サポートされているようには見えません。いつかこの機能が追加される可能性があります(Swiftは結局2年以内に発表されました)。なぜ彼らがそうしないのか、あるいはそうしなかったのかについての考えは、私の側の憶測でしょう。

17
PeejWeej

これは私の回避策です:

  protocol MyViewControllerDelegate : class {
     func eventHappened()
  }
  class MyViewController : UIViewController {
     typealias Delegate = MyViewControllerDelegate
     weak var delegate: Delegate?

     private func myFunc() {
         delegate?.eventHappened()
     }

  }
6