2016-05-25 2 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() 

Вместо этого создайте переменную как необязательную. Вы хотите аннулировать и уничтожить таймер, и вы никогда не хотите, чтобы таймер, который не был настроен должным образом или недействителен.

Ваше продление не подходит, поскольку оно касается аспектов, не охватываемых самим протоколом. У вас должно быть 2 протокола, где второй протокол расширяет первый и называется чем-то вроде TimerActivation. Он определяет функции и расширение реализует их.

Это не изменяет то, что вам нужно сделать в VC, чтобы использовать таймер, но это делает вашу систему типов чистой, эффективной, многоразовой и расширяемой.

Для самостоятельной ссылочной части вы должны смотреть на #selector, я не пробовал его в протокол перед тем, должно быть интересно ...

Это может быть разумнее поставить селектор, или вызов, к функции запуска, потому что в расширении протокола имеется мало точек, реализующих селектор, когда протокол является настолько общим. Но, я полагаю, вы можете добавить другие дочерние протоколы с расширениями, которые предоставляют другие реализации, чтобы вы могли смешивать функциональность, интересную идею ...

+0

Благодарим за отзыв. Да, я знаю о необходимости надлежащего инициирования и аннулирования NSTimer и т. Д. Код, который я опубликовал, должен только иллюстрировать мою основную идею отношений. В любом случае ключевой вопрос для меня - это #selector part. Я не уверен, что хорошо понимаю вас с последним абзацем. То, что я ищу сейчас, - это в основном расширение, которое я мог бы использовать в других классах с минимальным количеством кода = это на самом деле означает принцип наследования для меня, но Swift является ориентированным на протокол. Например: два UIViewControllers используют один и тот же механизм для таймеров, таких как одно и то же предупреждение или что-то в этом роде ... –

+0

Так что, возможно, вам не нужны таймеры как таковые, вы хотите, чтобы объекты команд содержали таймер и другую логику ... – Wain

+0

Да, это также можно сказать так, но я просто подумал, что вместо создания нового экземпляра для каждого использования таймера или помощника или что-то еще, было бы более полезно использовать одну и ту же функциональность через универсальное расширение протокола для имитации наследования ... так что это неправильно идея? –

Смежные вопросы