【问题标题】:What is a selector in SKAction: perform(_:onTarget:)SKAction 中的选择器是什么:perform(_:onTarget:)
【发布时间】:2016-11-01 05:24:04
【问题描述】:

文档说:

Declaration:

class func perform(_ selector: Selector, onTarget target: Any) -> SKAction

选择器

要调用的方法的选择器。

我不确定方法的选择器是什么。于是就有了这个问题。

这似乎是方法/函数的名称,但(在我身上)产生了不确定性,因为它从未被描述为这个,所以我有点认为它可能是别的东西,也许是更深刻的东西。

我假设perform(_:onTarget) 是一部分代码灵活地告诉对象在运行时决定执行什么操作的一种方式。但我不完全确定我的目的是正确的。这就是我思考这个问题的背景。

我的问题不仅在上下文方面与链接的“相似”问题不同,而且还是一个不同的、更具体的问题:这个特定函数中的选择器是什么。

【问题讨论】:

标签: swift sprite-kit selector skaction


【解决方案1】:

选择器是函数的名称,目标是执行该函数的对象。您使用语法构造一个选择器:#selector(<function name>),例如:

class MyClass {

    func createAction() {
        let action = SKAction.perform(#selector(MyClass.myActionFunction), onTarget: self)
        // ...
    }

    @objc func myActionFunction() {
        // do stuff
    }
}

要为接受参数的函数创建选择器,请使用以下语法:

#selector(MyClass.myActionFunction(arg1:arg2:))

你也可以使用块而不是选择器来完成同样的事情:

let action = SKAction.run { [weak self] in
    self?.myActionFunction()
}

【讨论】:

  • 你为什么在里面有@objc
  • 选择器是Objective-C的一种结构,它使用消息发送来调用函数。由于我们在 Swift 中工作,我们必须将函数暴露给 Objective-C 运行时才能将其用作选择器。使用@objc 是一种方法。另一种方法是让MyClass继承自NSObject
  • 选择器在 Objective-C 中的存在时间比块(闭包)更长。在块之前,选择器非常有用,因为对象(在这种情况下为 SKAction)不需要知道任何关于目标的信息就可以在其上调用函数。今天,尤其是在 Swift 中,将块传递给对象更为常见,然后它会异步保留和执行该对象。它实现了同样的目的。
  • 不确定我是否理解这个问题。它现在与SKAction 没有特别关联。从技术上讲,myActionFunction 有一个类型:() -> ()。即它不带参数,也没有返回值。
  • 啊,我现在明白你的问题了。 SKAction 有两个独立的函数,称为 run。一个接受 SKAction,另一个接受一个块。即使它们具有相同的名称,这些函数也可以是不同的,因为它们采用不同类型的参数。这称为函数“重载”。
猜你喜欢
  • 2016-12-05
  • 2022-07-21
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 2014-12-28
  • 2010-09-06
  • 1970-01-01
  • 2012-07-05
相关资源
最近更新 更多