gpt4 book ai didi

Swift:在初始化器中传递一个 func 作为参数

转载 作者:行者123 更新时间:2023-11-30 14:13:15 26 4
gpt4 key购买 nike

** 已更新以反射(reflect)建议的代码和更详细的说明 **

尝试使用图例 here 完成以下任务因为我需要子类实例最终将功能委托(delegate)给父类:

  1. 对 SKNode 进行子类化,使其可以执行以下操作:
    A。拥有 SKSpriteNode 类型的属性
    b.拥有一个接受回调/事件处理函数的属性
    C。此属性将在初始化时保存提供的回调函数
    d.该属性将“引发”一个事件(使用提供的回调函数,它将成为该实例的函数父对象)

但是,原始代码在“/*... */”之间给出了以下错误消息:

Cannot find an initializer for type 'ClickableSKSpriteNode' that accepts an argument list of type '(imageName: String, event: (String, string2: String) -> ())'

关于这个原始代码,我可能没有一个采用“string”,(string, string) ->()”的初始值设定项,但我确实有一个采用“string, Event<(String, String)”的初始值设定项>” 据我所知,它应该采用 (String, String) -> () 类型的函数作为替代。(我认为我对它如何工作的理解很可能是错误的......我来自c# 背景)

在进行了下面@ri​​kkigibson(非注释代码)建议的更改后,我收到了另一个错误(抱歉,目前我面前没有代码)。

有人对如何更改此代码以完成我想要做的事情有任何指导吗?

有问题的代码如下:

* EVENT-RELATED CODE *

public class Event<T> {

public typealias EventHandler = T -> ()

private var eventHandlers = [Invocable]()

public func raise(data: T) {
for handler in self.eventHandlers {
handler.invoke(data)
}
}

public func addHandler<U: AnyObject>(target: U, handler: (U) -> EventHandler) -> Disposable
{
let wrapper = EventHandlerWrapper(target: target, handler: handler, event: self)
eventHandlers.append(wrapper)
return wrapper
}
}


private protocol Invocable: class {
func invoke(data: Any)
}

private class EventHandlerWrapper<T: AnyObject, U>: Invocable, Disposable {
weak var target: T?
let handler: T -> U -> ()
let event: Event<U>

init(target: T?, handler: T -> U -> (), event: Event<U>) {
self.target = target
self.handler = handler
self.event = event;
}

func invoke(data: Any) -> () {
if let t = target {
handler(t)(data as! U)
}
}

func dispose() {
event.eventHandlers = event.eventHandlers.filter { $0 !== self }
}
}

public protocol Disposable {
func dispose()
}


* SUBCLASSED SKNODE-RELATED CODE *
import SpriteKit

class ClickableSKSpriteNode: SKNode
{
let cBackground: SKSpriteNode
let event: Event<(String, String)>
let handler: AnyObject

/*init(imageName: String, event: Event<(String, String)>)*/
init(imageName: String, handler: (String, String) -> ())
{
self.cBackground = SKSpriteNode(imageNamed: imageName)
/*self.event = event*/
self.event = Event<(String, String)>()
self.handler = self.event.addHander(handler)
super.init()
}


override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch:UITouch = touches.first as! UITouch
let positionInScene = touch.locationInNode(self)

if self.cBackground.containsPoint(positionInScene) {
self.event.raise("string one", "string two")
}
}

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

}

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {

}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}


* SUBCLASS OBJECT INSTANTIATION CODE *

......

let startButton = ClickableSKSpriteNode(imageName: "Start.png", event: self.handleStartClick)

......

func handleStartClick(string1: String, string2: String){
DebugPring("String1 = \(string1), String2 = \(string2)")
}

最佳答案

这是一个简单的类型不匹配。您对 init 的参数类型为 (String, String) -> () ,不是Event<(String, String)>

我怀疑 Array<T -> ()>如果您需要的是多个订阅者,作为节点子类的成员可能就足够了。

关于Swift:在初始化器中传递一个 func 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31508498/

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