2016-05-25 59 views
2

是否存在任何解決方案來使用指向自身的選擇器爲更多類創建可重用協議擴展? 例如,我正在嘗試擴展TimerHelper,其中添加了與NSTimer配合使用的相應功能。我發現這一點:可重複使用的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

我很抱歉,錯誤是字面意思:'參數類型'自我'不符合期望的類型'Anyobject'.'但在我看來這當前的錯誤並不重要 - 有更多的情況下,我嘗試根據職位我發現或其他例子等。這個代碼只是爲了說明我的想法。無論如何感謝 –

回答

0

不要這樣做:

... = NSTimer() 

取而代之的是創建變量。您想要使計時器失效並銷燬計時器,並且您永遠不想要一個尚未配置正確或無效的計時器。

你的擴展是不合適的,因爲它涉及協議本身沒有涉及的方面。你應該有兩個協議,第二個協議擴展第一個協議,並且被稱爲TimerActivation。它定義了函數和擴展實現它們。

這不會改變,你需要在VC做使用定時器的東西,但它使你的類型系統的清潔,有效,可重複使用和可擴展性。

對於你需要看看#selector自我指涉的一部分,我還沒有一個協議裏試了一下面前,應該是有趣......

這可能是明智的供應選擇,或調用,到啓動函數,因爲當協議如此普遍時,在實現選擇器的協議擴展中沒有什麼意義。但是,我想你可能想要添加其他擴展的子協議提供其他的實現,所以你可以mixin功能,有趣的想法...

+0

謝謝你的迴應。是的,我知道需要正確啓動並使NSTimer等無效。我發佈的代碼只能說明我關於關係的基本想法。無論如何,關鍵問題是我的#選擇器部分。我不確定我對最後一段的理解如何。我現在想要的基本上是擴展,我可以在其他類中使用最少量的代碼=這實際上意味着繼承我的原則,但Swift是面向協議的。例如:兩個UIViewControllers使用相同的機制,如同樣的警報等定時器... –

+0

因此,也許你不希望定時器本身,你想命令對象包含一個定時器和其他邏輯... – Wain

+0

是的,它也是可以這樣說,但我只是認爲,不是每次使用Timer或Helper或其他任何東西創建新實例,通過通用協議擴展來共享相同的功能可能會更有用,以模擬繼承...所以它是錯誤的理念? –