我想在我的类中嵌套一个协议来实现委托模式,如下所示:
class MyViewController : UIViewController {
protocol Delegate {
func eventHappened()
}
var delegate:MyViewController.Delegate?
private func myFunc() {
delegate?.eventHappened()
}
}
但是编译器不会允许它:
协议'委托'不能嵌套在另一个声明中
我可以通过在类范围之外声明MyViewControllerDelegate
来轻松地使其工作。
我的问题是为什么会有这样的限制?
Swift允许您定义嵌套类型,从而在它们支持的类型的定义中嵌套支持枚举,类和结构。
鉴于协议不在该列表上,似乎它目前不受支持。他们有可能在某些时候添加这个功能,(Swift宣布不到两年就会发布)。任何关于为什么他们不会或不会的想法将是我的推测。
这是我的工作:
protocol MyViewControllerDelegate : class {
func eventHappened()
}
class MyViewController : UIViewController {
typealias Delegate = MyViewControllerDelegate
weak var delegate: Delegate?
private func myFunc() {
delegate?.eventHappened()
}
}
你班级的另一个问题是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()
}
}
作为一种深奥的练习,这可能会有助于推动类可能做的事情的界限,但是没有人应该尝试在类中声明协议。协议都是关于类型组合和集合的。当您被限制在同一外部类中时,没有代码重用方案。