Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中在块内运行方法_Swift_Sprite Kit_Swift2 - Fatal编程技术网

在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