运行 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.runBlock
,SKAction.runBlock
不会接受。
为了澄清,这是另一个例子。假设您有以下功能:
func takesAFunc(c: (Int, Int) -> Int) -> Void {
print(c(1, 2))
}
并且您想传入一个将两个数字相加的函数。你可以写:
takesAFunc { num1, num2 in
num1 + num2
}
// Prints: 3
但是,您也可以只传入接受 Int
s 的 +
运算符 - 这也是一个函数。看看定义:
func +(lhs: Int, rhs: Int) -> Int
符合takesAFunc
要求的类型,因此可以写成:
takesAFunc(+) // Prints: 3
这可能是一个愚蠢的问题,但仍然......我在这样的块中调用函数:
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.runBlock
,SKAction.runBlock
不会接受。
为了澄清,这是另一个例子。假设您有以下功能:
func takesAFunc(c: (Int, Int) -> Int) -> Void {
print(c(1, 2))
}
并且您想传入一个将两个数字相加的函数。你可以写:
takesAFunc { num1, num2 in
num1 + num2
}
// Prints: 3
但是,您也可以只传入接受 Int
s 的 +
运算符 - 这也是一个函数。看看定义:
func +(lhs: Int, rhs: Int) -> Int
符合takesAFunc
要求的类型,因此可以写成:
takesAFunc(+) // Prints: 3