gpt4 book ai didi

ios - 可重用的 Swift 扩展和选择器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:09 25 4
gpt4 key购买 nike

是否存在任何解决方案来为更多类使用指向自身的选择器进行可重用协议(protocol)扩展?例如,我正在尝试制作扩展 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()
}
}

谢谢

最佳答案

永远不要:

... = NSTimer()

而是将变量创建为可选变量。您想要使计时器失效并销毁,并且您永远不想要未正确配置或失效的计时器。

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

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

自引用部分你需要看一下#selector,我之前没有在协议(protocol)里面试过,应该很有趣...

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

关于ios - 可重用的 Swift 扩展和选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com