2017-02-27 120 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