2015-07-11 475 views
0

块内部运行的方法,这可能是一个愚蠢的问题,但仍...我打电话这样的块中的函数:斯威夫特

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

func createMyNode() { 
    // blabla 
} 

我不明白这一点。在self.createMyNode之后应该有括号,但是这仍然是编译的。这是怎么回事?

回答

3

你其实不是调用函数,createMyNode将被称为内SKAction.runBlock,你只是把它当作一个论据。

看看SKAction.runBlock接受的类型,从SKAction documentation

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

而且从GCD documentation

typealias dispatch_block_t =() -> Void 

因此,SKAction.runBlock接受一个函数(或关闭,他们是同样的东西),它不需要参数并返回Void;这正是你用createMyNode补充的东西。

有了这个信息很清楚的看到你为什么不createMyNode后加括号 - 因为这会调用该函数,从而传递到VoidSKAction.runBlock,(的createMyNode返回类型),这SKAction.runBlock不会接受。


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

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

而你想传递一个函数来添加这两个数字。您可能写:

takesAFunc { num1, num2 in 
    num1 + num2 
} 

// Prints: 3 

但或者,你可以只通过在+运营商接受Int秒 - 这是一个功能了。看看定义:

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

这由takesAFunc所需的类型相匹配,因此,你可以这样写:

takesAFunc(+) // Prints: 3 
1

runBlock想要一个函数作为你在这里提供的参数(所以self.createMyNode只是对函数本身的引用)。

但你也可以将函数调用包在一个闭包像这样:

let makeRocks = 

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