【问题标题】:Reusable Swift extension and selectors可重用的 Swift 扩展和选择器
【发布时间】:2016-05-25 09:40:37
【问题描述】:

是否存在任何解决方案来为更多具有指向自身的选择器的类进行可重用的协议扩展? 例如,我正在尝试制作扩展 TimerHelper,它添加了与 NSTimer 一起使用的适当功能。我发现了这个:

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

谢谢

【问题讨论】:

  • 不起作用是什么意思?有没有具体的错误?
  • 我很抱歉错误是字面意思:Argument type 'Self' does not conform to expected type 'Anyobject'. 但在我看来,这个当前的错误并不重要 - 根据我发现的帖子或其他示例等,我尝试了更多情况下的错误。这段代码应该只是为了说明我的想法。还是谢谢

标签: ios swift macos selector


【解决方案1】:

永远不要这样做:

... = NSTimer()

而是将变量创建为可选项。您想使计时器无效并销毁,并且您永远不希望没有正确配置或无效的计时器。

您的扩展不合适,因为它处理协议本身未涵盖的方面。您应该有 2 个协议,其中第二个协议扩展了第一个协议,并被称为 TimerActivation。它定义了函数,扩展实现了它们。

这不会改变您在 VC 中使用计时器需要做的事情,但它会使您的类型系统干净、有效、可重用和可扩展。

关于自引用部分你需要看#selector,我之前没有在协议中尝试过,应该很有趣......

向 start 函数提供选择器或调用可能更明智,因为当协议如此通用时,实现选择器的协议扩展几乎没有意义。但是,我想您可能想要添加其他带有扩展的子协议,这些扩展提供其他实现,以便您可以混合功能,有趣的想法......

【讨论】:

  • 感谢您的回复。是的,我知道需要正确启动和使 NSTimer 无效等。我发布的代码应该只说明我对关系的基本概念。无论如何,关键问题对我来说是#selector 部分。我不确定我对最后一段的理解是否很好。我现在正在寻找的基本上是扩展,我可以用最少的代码在其他类中使用它=这实际上对我来说意味着继承原则,但 Swift 是面向协议的。例如:两个 UIViewController 对定时器使用相同的机制,例如相同的警报或类似的东西......
  • 所以也许你不想要这样的计时器,你想要包含计时器和其他逻辑的命令对象......
  • 是的,也可以这样说,但我只是认为,与其为每次使用 Timer 或 Helper 或其他任何东西创建新实例,不如通过通用协议共享相同的功能可能更有用-模拟继承的扩展......这是错误的想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多