2017-02-27 52 views
0

我想创建一个当前UIViewController.present函数符合的协议(委托)。UIViewController中的present()函数的Swift协议

因此,例如,该协议是:

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”没有实现

现在我假设的原因是因为在原有的功能,具有设置为完成功能的默认参数作为“无”。 但是,协议不支持默认参数。

所以对我的问题:我可以,如果是这样,创建一个协议,其中UIViewController.present(...)函数可以符合?

回答

3

仅仅因为它们具有正确的功能而不符合协议。你必须明确表示类型符合。在你的情况下,这只是意味着增加:

extension UIViewController: PresentPopupDelegate {} 

因为它已经有正确的实现,所以这里不需要一个实体。

这个要求明确符合性的选择是Swift中的有意设计决定。请参阅Ole Begemann对Protocols are more than Bags of Syntax推理的精彩摘要。

+0

良好的通话。和一个伟大的阅读!!!,我已经扩展到UIViewController。但是现在出现以下错误: 方法'presentViewController:animated:completion:'由方法'present(_:animated:completion :)'提供'与要求的选择器不匹配('present:animated:completion:') – giLisH

+0

I不能重现这一点。你确定你的协议正是你在这里列出的吗?特别是,你确定你在第一个参数之前不会错过'_'吗? –

+0

我编辑了这个问题以更好地反映我正在尝试做的事情。 到你的q:_不是从func中丢失的。 谢谢! – giLisH