Ios 可重用的Swift扩展和选择器

Ios 可重用的Swift扩展和选择器,ios,swift,macos,selector,Ios,Swift,Macos,Selector,是否存在任何解决方案,使可重用的协议扩展为更多的类与选择器将指向自己? 例如,我尝试创建扩展名TimerHelper,它添加了适当的函数来处理NSTimer。我发现: 但解决方案似乎有点曲折 我试图在代码中制作的东西,当然不起作用,是这样的: protocol TimerHelper { var timer:NSTimer { get set } } extension TimerHelper { func startTimer() { timer = N

是否存在任何解决方案,使可重用的协议扩展为更多的类与选择器将指向自己? 例如,我尝试创建扩展名
TimerHelper
,它添加了适当的函数来处理
NSTimer
。我发现:

但解决方案似乎有点曲折

我试图在代码中制作的东西,当然不起作用,是这样的:

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

千万不要:

... = NSTimer()
而是将变量创建为可选变量。您希望使计时器无效并销毁,并且您永远不希望计时器未正确配置或无效

您的扩展不合适,因为它处理协议本身未涵盖的方面。您应该有两个协议,其中第二个协议扩展了第一个协议,称为类似于
timeraction
。它定义了函数,扩展实现了这些函数

这不会改变在VC中使用计时器所需的操作,但会使您的类型系统干净、有效、可重用和可扩展

对于您需要查看的自引用部分,
#selector
,我以前没有在协议中尝试过,应该很有趣


向start函数提供选择器或调用可能更明智,因为当协议如此通用时,实现选择器的协议扩展没有什么意义。但是,我想您可能想添加其他具有扩展的子协议,这些扩展提供了其他实现,这样您就可以混合功能,这是一个有趣的想法……

不起作用意味着什么?是否存在具体错误?很抱歉,错误的字面意思是:
参数类型“Self”与预期类型“Anyobject”不一致。
但在我看来,当前的错误并不重要-根据我找到的帖子或其他示例等,我尝试的更多情况下会出现大量错误。此代码仅用于说明我的主意。谢谢你的回复。是的,我知道需要适当地启动NSTimer并使其无效,等等。我发布的代码应该只说明我对关系的基本想法。无论如何,对我来说,关键问题是选择部分。我不确定我对你的最后一段是否理解得很好。我现在寻找的基本上是扩展,我可以在其他类中使用最少的代码量=这实际上意味着我要继承的原则,但Swift是面向协议的。例如:两个UIViewController对计时器使用相同的机制,例如相同的警报或类似的东西…因此,也许您不需要计时器本身,您需要包含计时器和其他逻辑的命令对象…是的,也可以这样说,但我只是想,不是为每次使用计时器或帮助器或其他任何东西创建新实例,通过通用协议扩展共享相同的功能来模拟继承可能更有用……那么这是错误的想法吗?