次のようなデリゲートパターンを実装するために、クラスにプロトコルをネストしたいと思います。
class MyViewController : UIViewController {
protocol Delegate {
func eventHappened()
}
var delegate:MyViewController.Delegate?
private func myFunc() {
delegate?.eventHappened()
}
}
しかし、コンパイラはそれを許可しません:
プロトコル「デリゲート」を別の宣言内にネストすることはできません
クラススコープの外でMyViewControllerDelegate
を宣言することで、簡単に機能させることができます。
私の質問はなぜそのような制限ですか?
Swift documenation によると
Swiftを使用すると、ネストされた型を定義できます。これにより、サポートする列挙、クラス、および構造を、それらがサポートする型の定義内にネストできます。
プロトコルがそのリストにない場合、現在サポートされているようには見えません。いつかこの機能が追加される可能性があります(Swiftは結局2年以内に発表されました)。なぜ彼らがそうしないのか、あるいはそうしなかったのかについての考えは、私の側の憶測でしょう。
これは私の回避策です:
protocol MyViewControllerDelegate : class {
func eventHappened()
}
class MyViewController : UIViewController {
typealias Delegate = MyViewControllerDelegate
weak var delegate: Delegate?
private func myFunc() {
delegate?.eventHappened()
}
}