你能快速运行函数多次吗?
Posted
技术标签:
【中文标题】你能快速运行函数多次吗?【英文标题】:can you run functions multiple times swift? 【发布时间】:2021-04-02 03:28:21 【问题描述】:我正在 Swift Playgrounds 中开发一款游戏,我试图让一个函数在变量发生变化时运行多次。这是我下面的代码
public override func mouseDown(with event1: NSEvent)
NP = self.childNode(withName: "NP") as? SKLabelNode
txt = self.childNode(withName: "Talking") as? SKLabelNode
let point1 = event1.location(in: self)
let hitnodes1 = self.nodes(at: point1)
var counter = 0
if hitnodes1.contains(where: $0.name == "NP")
if (counter == 0)
txt.text = "Test2"
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) counter += 1
//wait here so that it doest automatically go to the next one
if (counter == 1)
txt.text = "Test3"
counter += 1
我认为问题出在我的计数器上,但也可能出在函数本身上。有没有人知道如何解决这个问题?任何帮助都会很棒:)
【问题讨论】:
你试图多次调用什么函数。我假设它应该由counter
控制,您希望通过 asyncAfter
闭包对其进行更新。但我没有看到任何会调用函数的东西。您是否尝试模拟鼠标点击第二次?
@ChipJarred 是的,我正在尝试模拟鼠标第二次点击。除了我这样做的方式之外,还有其他方法吗?
有多种方法可以做到。我将发布一个可能的答案。
你的问题让我想到了更多的方法。您可以使用NSApp.sendEvent
重新发送事件,以通过正常机制重新发送事件。在这种情况下,您需要一种方法来保持计数器处于活动状态。您可以将其设为视图的属性,也可以使用NSEvent
的userData
属性,但它是UnsafeRawMutablePointer
,因此您将负责分配和释放它。
【参考方案1】:
如果了解您想要做什么(我完全有可能不这样做),我认为按照以下思路可以做到:
public override func mouseDown(with event1: NSEvent)
mouseDown(with: event1, counter: 0)
private func mouseDown(with event: NSEvent, counter: Int)
NP = self.childNode(withName: "NP") as? SKLabelNode
txt = self.childNode(withName: "Talking") as? SKLabelNode
let point1 = event1.location(in: self)
let hitnodes1 = self.nodes(at: point1)
if hitnodes1.contains(where: $0.name == "NP")
switch counter
case 0:
txt.text = "Test2"
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0)
self.mouseDown(with: event, counter: counter + 1)
//wait here so that it doest automatically go to the next one
case 1:
txt.text = "Test3"
// This will actually generate a 3rd mouse click
mouseDown(with: event, counter: counter + 1)
default: break
正如 David Wheeler 所说,“您可以通过添加间接层来解决任何问题。”在这种情况下,通过让实际的 AppKit mouseDown
调用一个带有计数器参数的私有应用程序,您可以直接从 DispatchQueue.asyncAfter
调用带有计数器的应用程序
【讨论】:
天哪,非常感谢!这很棒:) 我很高兴它有帮助以上是关于你能快速运行函数多次吗?的主要内容,如果未能解决你的问题,请参考以下文章