我想创建一个当前UIViewController.present函数符合的协议(委托)。
所以例如协议是:
protocol PresentPopupDelegate
{
func doSomething()
func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Swift.Void)?)
}
需要符合此协议的类是:
class MyViewController:UIViewController, PresentPopupDelegate {
func doSomething()
}
让我说我有这段代码:
let delegate:PresentPopupDelegate
init() {
self.delegate = MyViewController()
}
编译这将导致警告说
方法'存在:动画:完成:'在协议中'PresentPopupDelegate'未实现
现在我假设原因是因为在原始函数中有一个默认参数设置为完成函数为“nil”。 但是,协议不支持默认参数。
所以我的问题:我可以,如果是这样,创建一个UIViewController.present(...)函数可以符合的协议吗?
答案 0 :(得分:3)
类型不符合协议只是因为它们具有正确的功能。你必须明确地说类型符合。在您的情况下,这只是意味着添加:
extension UIViewController: PresentPopupDelegate {}
这里不需要一个机构,因为它已经有了正确的实现。
要求明确一致性的这种选择是Swift中有意的设计决策。请参阅Ole Begemann在Protocols are more than Bags of Syntax中对推理的精彩总结。