我不明白这段代码里发生了什么...
fileprivate func genericNodeWalker(_ direction:Follow, encapsulatedMethod: @escaping (_ iNode:Int) -> Void) {
switch direction {
case .forwards:
for nodeIndex in 0..<self.nodes.count {
encapsulatedMethod(nodeIndex)
}
case .backwards:
for indexNode in stride(from: self.nodes.count - 1, through: 0, by: -1) {
// for nodeIndex in (0..<self.nodes.count).reversed() {
print("indexNode \(indexNode)")
encapsulatedMethod(indexNode)
}
}
}
fileprivate func fadeOutNodes2() {
genericNodeWalker(.backwards) { index2D in
let wait = SKAction.wait(forDuration: Double(index2D) * 2)
let custom = SKAction.run {
print("index2D \(index2D)")
}
let sequence = SKAction.sequence([wait,custom])
self.nodes[index2D].run(sequence)
}
}
我让它倒着数,它就倒着数但是封装方法中的代码fadeOutNodes2向前运行?
indexNode 6
indexNode 5
indexNode 4
indexNode 3
indexNode 2
indexNode 1
indexNode 0
index2D 0
index2D 1
index2D 2
index2D 3
index2D 4
index2D 5
index2D 6
这里是否有明显的错误,我不能,我不能看到树木的木材?如果我改变循环向前运行,它也向前运行。
我怎么能让它倒着跑呢?
1条答案
按热度按时间klsxnrf11#
我不太确定你想做什么,但是一个更好的
genericNodeWalker
API可能是这样的(我假设nodes
是SKNode
的数组,如果需要,请更改类型):步行者将按照您要求的顺序调用回调函数,并且每次调用都将传递一个从零开始的递增索引。
所以,如果你有节点
a
到c
,那么步行者在交互转发时将用(0,a)
,(1,b)
,(2,c)
调用encapsulatedMethod
,并将用(0,c)
,(1,b)
,(2,a)
。步行者不关心你对索引做了什么。它不关心延迟。它只是按照您要求的顺序将节点传递给回调方法,并为每个节点提供一个从0开始的索引。这也意味着回调函数本身被传递了一个
node
,并且不需要根据索引在self.nodes
中找到它。也不需要使用@escaping
,因为回调闭包不会转义。它将在genericNodeWalker
返回之前为每个节点调用。也许这更好,也许不是。但我认为这是一个更干净的API。