运行 Swift 块内的方法

Running methods inside a block in Swift

这可能是一个愚蠢的问题,但仍然......我在这样的块中调用函数:

let makeRocks = SKAction.sequence([SKAction.runBlock(self.createMyNode),<---- here should be () 
                                   SKAction.waitForDuration(0.1, withRange: 0.15)])

func createMyNode() {
    // blabla
}

我不明白。 self.createMyNode 之后应该有括号,但这仍然可以编译。怎么会这样?

runBlock 想要一个函数作为您在此处提供的参数(因此 self.createMyNode 只是对函数本身的引用)。

但您也可以像这样将函数调用包装在闭包中:

let makeRocks = 

SKAction.sequence([SKAction.runBlock{ self.createMyNode() },
                                   SKAction.waitForDuration(0.1, withRange: 0.15)])

您实际上并没有调用该函数,createMyNode 将在 SKAction.runBlock 内部调用,您只是将其作为参数传递。

看看 SKAction.runBlock 接受的类型,来自 SKAction documentation:

class func runBlock(_ block: dispatch_block_t) -> SKAction

并且来自 GCD documentation

typealias dispatch_block_t = () -> Void

因此,SKAction.runBlock 接受一个函数(或闭包,它们是同一件事),它不带任何参数并且 returns Void;这正是您要提供的 createMyNode

有了这些信息,就可以清楚地看到为什么不在 createMyNode 之后添加括号 - 因为那样会调用函数,从而传递 Void(return 类型的 createMyNode) 到 SKAction.runBlockSKAction.runBlock 不会接受。


为了澄清,这是另一个例子。假设您有以下功能:

func takesAFunc(c: (Int, Int) -> Int) -> Void {
    print(c(1, 2))
}

并且您想传入一个将两个数字相加的函数。你可以写:

takesAFunc { num1, num2 in
    num1 + num2
}

// Prints: 3

但是,您也可以只传入接受 Ints 的 + 运算符 - 这也是一个函数。看看定义:

func +(lhs: Int, rhs: Int) -> Int

符合takesAFunc要求的类型,因此可以写成:

takesAFunc(+) // Prints: 3