Swift循环反向运行?代码难题

ivqmmu1c  于 2023-03-22  发布在  Swift
关注(0)|答案(1)|浏览(118)

我不明白这段代码里发生了什么...

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

这里是否有明显的错误,我不能,我不能看到树木的木材?如果我改变循环向前运行,它也向前运行。
我怎么能让它倒着跑呢?

klsxnrf1

klsxnrf11#

我不太确定你想做什么,但是一个更好的genericNodeWalker API可能是这样的(我假设nodesSKNode的数组,如果需要,请更改类型):

fileprivate func genericNodeWalker(_ direction:Follow, encapsulatedMethod: (_ index: Int, _ node: SKNode) -> Void) {
    switch direction {
    case .forwards:
        nodes.enumerated().forEach(encapsulatedMethod)
    case .backwards:
        nodes.reversed().enumerated().forEach(encapsulatedMethod)
    }
}

fileprivate func fadeOutNodes2() {
    genericNodeWalker(.backwards) { index, node  in
        let wait = SKAction.wait(forDuration: Double(index) * 2)
        let custom = SKAction.run {
            print("index \(index)")
        }
        let sequence = SKAction.sequence([wait,custom])
        node.run(sequence)
    }
}

步行者将按照您要求的顺序调用回调函数,并且每次调用都将传递一个从零开始的递增索引。
所以,如果你有节点ac,那么步行者在交互转发时将用(0,a)(1,b)(2,c)调用encapsulatedMethod,并将用(0,c)(1,b)(2,a)。步行者不关心你对索引做了什么。它不关心延迟。它只是按照您要求的顺序将节点传递给回调方法,并为每个节点提供一个从0开始的索引。
这也意味着回调函数本身被传递了一个node,并且不需要根据索引在self.nodes中找到它。也不需要使用@escaping,因为回调闭包不会转义。它将在genericNodeWalker返回之前为每个节点调用。
也许这更好,也许不是。但我认为这是一个更干净的API。

相关问题