在Swift中在块内运行方法
这可能是一个愚蠢的问题,但仍然。。。我在块内调用一个函数,如下所示:在Swift中在块内运行方法,swift,sprite-kit,swift2,Swift,Sprite Kit,Swift2,这可能是一个愚蠢的问题,但仍然。。。我在块内调用一个函数,如下所示: let makeRocks = SKAction.sequence([SKAction.runBlock(self.createMyNode),<---- here should be () SKAction.waitForDuration(0.1, withRange: 0.15)]) func createMyNode() { // b
let makeRocks = SKAction.sequence([SKAction.runBlock(self.createMyNode),<---- here should be ()
SKAction.waitForDuration(0.1, withRange: 0.15)])
func createMyNode() {
// blabla
}
让makeRocks=SKAction.sequence([SKAction.runBlock(self.createMyNode),runBlock
需要一个函数作为您在此处提供的参数(因此self.createMyNode
只是对函数本身的引用)
但您也可以将函数调用封装在闭包中,如下所示:
let makeRocks =
SKAction.sequence([SKAction.runBlock{ self.createMyNode() },
SKAction.waitForDuration(0.1, withRange: 0.15)])
runBlock
需要一个函数作为您在此处提供的参数(因此self.createMyNode
只是对函数本身的引用)
但您也可以将函数调用封装在闭包中,如下所示:
let makeRocks =
SKAction.sequence([SKAction.runBlock{ self.createMyNode() },
SKAction.waitForDuration(0.1, withRange: 0.15)])
实际上,您并不是在调用函数,createMyNode
将在SKAction.runBlock
中被调用,您只是将其作为参数传递
查看类型SKAction.runBlock
accepts,来自:
从以下方面:
因此,SKAction.runBlock
接受一个函数(或闭包,它们是一样的),该函数不带任何参数,并返回Void
;这正是您使用createMyNode
提供的功能
有了这些信息,我们很清楚为什么不在createMyNode
之后添加括号,因为这样会调用函数,从而将Void
(返回类型createMyNode
)传递给SKAction.runBlock
,而SKAction.runBlock
不会接受
为了澄清,这里有另一个例子。假设你有这个功能:
func takesAFunc(c: (Int, Int) -> Int) -> Void {
print(c(1, 2))
}
您希望传入一个函数,该函数将两个数字相加。您可以编写:
但是,您也可以只传入接受Int
s的+
运算符-这也是一个函数。请查看定义:
func +(lhs: Int, rhs: Int) -> Int
与takesAFunc
所需的类型匹配,因此您可以编写:
takesAFunc(+) // Prints: 3
实际上,您并不是在调用函数,createMyNode
将在SKAction.runBlock
中被调用,您只是将其作为参数传递
查看类型SKAction.runBlock
accepts,来自:
从以下方面:
因此,SKAction.runBlock
接受一个函数(或闭包,它们是一样的),该函数不带任何参数,并返回Void
;这正是您使用createMyNode
提供的功能
有了这些信息,我们很清楚为什么不在createMyNode
之后添加括号,因为这样会调用函数,从而将Void
(返回类型createMyNode
)传递给SKAction.runBlock
,而SKAction.runBlock
不会接受
为了澄清,这里有另一个例子。假设你有这个功能:
func takesAFunc(c: (Int, Int) -> Int) -> Void {
print(c(1, 2))
}
您希望传入一个函数,该函数将两个数字相加。您可以编写:
但是,您也可以只传入接受Int
s的+
运算符-这也是一个函数。请查看定义:
func +(lhs: Int, rhs: Int) -> Int
与takesAFunc
所需的类型匹配,因此您可以编写:
takesAFunc(+) // Prints: 3