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