2017-02-27 3 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は」今私は、元の関数で補完機能に設定されたデフォルトのパラメータを持っているので、理由があると仮定しています"無し"とします。 しかし、プロトコルはデフォルトのパラメータをサポートしていません。私の質問にそう

:I、およびので、どのように場合は、UIViewController.present(...)関数が準拠可能なプロトコルを作成することはできますか?

答えて

3

タイプは正しい機能を持っているという理由だけでプロトコルに準拠していません。あなたは、型が適合していると明示的に言わなければなりません。それは、すでに権利の実装を持っているので、体の必要は、ここにありません

extension UIViewController: PresentPopupDelegate {} 

:あなたのケースでは、それは単に追加することを意味します。

明示的な適合を要求するこの選択は、Swiftの意図的な設計上の決定でした。 Ole Begemannの推論の優れた要約をProtocols are more than Bags of Syntaxでご覧ください。

+0

よろしくお願いします。素晴らしい読み物!!!、私はUIViewControllerに拡張機能を追加しました。 方法「presentViewController::アニメーション:完了:」しかし、今、次のエラー取得しています方法により提供さ「が存在し(_:完了:):アニメーション」) – giLisH

+0

I要件のセレクタ(「:アニメーション:完了存在」と一致しません。これを再現することはできません。あなたのプロトコルはあなたがここに挙げたものとまったく同じですか?特に、最初のパラメータの前に '_'が足りないことは確かですか? –

+0

私は私が何をしようとしているよりよく反映するために質問を編集しました。 あなたのqに:_はfuncから欠落していません。 ありがとう! – giLisH

関連する問題