嵌套在类中的Swift协议

问题描述 投票:12回答:3

我想在我的类中嵌套一个协议来实现委托模式,如下所示:

class MyViewController : UIViewController {

    protocol Delegate {
        func eventHappened()
    }

    var delegate:MyViewController.Delegate?

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

但是编译器不会允许它:

协议'委托'不能嵌套在另一个声明中

我可以通过在类范围之外声明MyViewControllerDelegate来轻松地使其工作。 我的问题是为什么会有这样的限制?

swift swift-protocols
3个回答
17
投票

根据swift documenation

Swift允许您定义嵌套类型,从而在它们支持的类型的定义中嵌套支持枚举,类和结构。

鉴于协议不在该列表上,似乎它目前不受支持。他们有可能在某些时候添加这个功能,(Swift宣布不到两年就会发布)。任何关于为什么他们不会或不会的想法将是我的推测。


6
投票

这是我的工作:

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

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

  }

-6
投票

你班级的另一个问题是delegate没有具体的类型。你可以宣布它是一个MyViewController.Delegate?,因为它是一个可选类型,可以是.None。但这只会使你的私人myFunc死代码。只有枚举,类和结构才能符合协议。这三种类型中哪一种是delegate

也就是说,这不是你问题的原因。当我为delegate制作一个真正的类型并使其符合Delegate协议时,我仍然得到相同的错误。

class MyViewController: UIViewController {

  protocol Delegate {
    func eventHappened()
  }

  class Classy: Delegate {
    func eventHappened() {
      print("eventHappened")
    }
  }

  var delegate: Classy? = Classy()

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

enter image description here

作为一种深奥的练习,这可能会有助于推动类可能做的事情的界限,但是没有人应该尝试在类中声明协议。协议都是关于类型组合和集合的。当您被限制在同一外部类中时,没有代码重用方案。

© www.soinside.com 2019 - 2024. All rights reserved.