2016-05-25 16 views
2

それ自身を指し示すセレクタを持つより多くのクラスに対して、再利用可能なプロトコル拡張を行うためのソリューションはありますか? たとえば、と連携する適切な機能を追加する拡張子TimerHelperを作成しようとしています。私はこれが見つかりました:私はもちろん、動作しない、コードで作るしようとしています何再利用可能なSwiftエクステンションとセレクタ

...

https://forums.developer.apple.com/thread/26983

https://forums.developer.apple.com/message/49465#49465

しかし、解決策ビット曲がりくねったようですが、何かでありますこのような:

protocol TimerHelper { 
    var timer:NSTimer { get set } 
} 

extension TimerHelper { 

    func startTimer() { 
     timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: self.updateTimer(), userInfo: nil, repeats: true) 
    } 

    func updateTimer() { 
     print("Timer updated.") 
    } 
} 

class ViewController: UIViewController, TimerHelper { 

    var timer: NSTimer = NSTimer() 
    func start() { 
     startTimer() 
    } 
} 

おかげ

+1

は意味しませんか?特にエラーはありますか? – Harris

+0

エラーは文字どおり残念です: '引数タイプ 'Self'は予想されるタイプ 'Anyobject'に適合しません。 'しかし、私の意見では、この現在のエラーは重要ではありません - より多くの状況では、私は、他の例などを見つけました。このコードは、私の考えを説明するためのものでした。とにかくありがとう –

答えて

0

しないでください:

... = NSTimer() 

代わりに、オプションとして変数を作成してください。タイマーを無効にして破棄したいので、タイマーが正しく構成されていないか、無効になっているタイマーは決して必要ありません。

拡張子が不適切なのは、プロトコル自体でカバーされていない側面を扱うためです。 2つのプロトコルが必要です。第2のプロトコルが最初に拡張され、TimerActivationのように呼び出されます。それは関数を定義し、拡張はそれを実装します。

これは、タイマーを使用するためにVCで行う必要はありませんが、あなたのタイプシステムをきれいで、効果的で、再利用可能で、拡張可能にします。

あなたは#selectorを調べる必要があり、自己参照の部分については、私は、前のプロトコルの内側にそれを試していない興味深いものになるはずです...

セレクタ、または呼び出しを供給するために賢明であってもよいし、プロトコルが非常に一般的なときにセレクタを実装しているプロトコル拡張にはほとんどポイントがないので、start関数に渡します。しかし、私は他の実装を提供する拡張子を持つ他の子プロトコルを追加して、機能、興味深いアイデアを混在させたいと思うと思います...

+0

応答ありがとうございます。はい、私はNSTimerを適切に開始し無効にする必要性を認識しています。私が掲示したコードは、私の基本的な関係のアイデアだけを示すべきです。とにかく重要な問題は、私にとっては#セレクタの部分です。私は最後の段落であなたをよく理解しているとは思えません。私が今探しているのは基本的には、他のクラスでも最小限のコードで使用できる拡張です。これは実際には私のための継承の原則を意味しますが、Swiftはプロトコル指向です。たとえば:2つのUIViewControllerは、同じアラートやそのようなもののようなタイマーに対して同じメカニズムを使用します。 –

+0

タイマーなどを必要としない場合は、タイマーやその他のロジックを含むコマンドオブジェクトが必要です。 – Wain

+0

はいそのように言えるかもしれませんが、私はちょうど、TimerやHelperの使用ごとに新しいインスタンスを作成するのではなく、継承をシミュレートするために汎用のプロトコル拡張を使って同じ機能を共有する方が便利かもしれないと思っています。アイディア? –

関連する問題