2016-05-25 16 views
2

Gibt es eine Lösung, um wiederverwendbare Protokollerweiterung für mehr Klassen mit Selektoren zu machen, die auf sich selbst zeigen würden? Zum Beispiel versuche ich die Erweiterung TimerHelper zu machen, die entsprechende Funktionen hinzufügt, um mit NSTimer zu arbeiten. Ich fand dies:Wiederverwendbare Swift-Erweiterung und Selektoren

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

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

Aber Lösung scheint ein wenig verwinkelt ...

Was ich versuche, in Code zu machen, was natürlich nicht funktioniert, ist etwas, wie folgt aus:

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() 
    } 
} 

Dank

+1

nicht arbeiten können, bedeutet? Gibt es speziell einen Fehler? – Harris

+0

Es tut mir leid, der Fehler ist wörtlich: 'Argumenttyp 'Self' entspricht nicht dem erwarteten Typ 'AnyObject'. Aber meiner Meinung nach ist dieser aktuelle Fehler nicht wichtig - es gab eine Menge Fehler für mehr Situationen, die ich nach Posts versuchte Ich fand oder andere Beispiele usw. Dieser Code sollte nur meine Idee veranschaulichen. Danke trotzdem –

Antwort

0

Niemals:

Stattdessen die Variable als optional erstellen. Sie möchten den Timer ungültig machen und zerstören, und Sie möchten nie einen Timer, der nicht richtig konfiguriert oder ungültig gemacht wurde.

Ihre Erweiterung ist unangemessen, da sie Aspekte behandelt, die vom Protokoll selbst nicht abgedeckt werden. Sie sollten 2 Protokolle haben, wobei das zweite Protokoll das erste erweitert und etwas wie TimerActivation heißt. Es definiert die Funktionen und die Erweiterung implementiert sie.

Dies ändert nicht, was Sie in der VC tun müssen, um den Timer zu verwenden, aber es macht Ihr Typsystem sauber, effektiv, wiederverwendbar und erweiterbar.

Für den selbst verweis Teil, den Sie bei #selector suchen müssen, ich habe es vorher in einem Protokoll nicht ausprobiert, sollte interessant sein ...

Es kann klüger sein, die Wähler, oder einen Aufruf zu liefern, zur Startfunktion, weil es wenig Sinn macht, in einer Protokollerweiterung den Selektor zu implementieren, wenn das Protokoll so allgemein ist. Aber, ich nehme an, dass Sie vielleicht andere Kindprotokolle mit Erweiterungen hinzufügen möchten, die andere Implementierungen zur Verfügung stellen, damit Sie Funktionalität, interessante Idee ...

+0

Danke für die Antwort. Ja, ich bin mir der Notwendigkeit bewusst, NSTimer und so weiter zu initiieren und ungültig zu machen. Der Code, den ich gepostet habe, sollte nur meine Grundidee von Beziehungen illustrieren. Wie auch immer, das Schlüsselproblem ist für mich der #selector Teil. Ich bin mir nicht sicher, ob ich dich mit dem letzten Absatz gut verstehe. Was ich jetzt suche, ist im Grunde eine Erweiterung, die ich in anderen Klassen mit einem Minimum an Code verwenden könnte = dies bedeutet tatsächlich das Prinzip des Erbens für mich, aber Swift ist protokollorientiert. Zum Beispiel: zwei UIViewControllers verwenden den gleichen Mechanismus für Timer wie die gleiche Warnung oder so ähnlich ... –

+0

Also vielleicht wollen Sie nicht Timer als solche, Sie wollen Befehlsobjekte, die einen Timer und andere Logik enthalten ... – Wain

+0

Ja, es auch kann man so sagen, aber ich dachte nur, dass es statt einer neuen Instanz für jede Verwendung von Timer oder Helper oder was auch immer nützlich sein könnte, dieselbe Funktionalität über eine universelle Protokollerweiterung zu teilen, um das Erben zu simulieren ... so ist es falsch Idee? –