2015-07-11 215 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)])