gpt4 book ai didi

swift - 在 Swift 的 block 内运行方法

转载 作者:行者123 更新时间:2023-11-28 10:23:11 24 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但仍然......我在这样的 block 中调用函数:

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

func createMyNode() {
// blabla
}

我不明白。 self.createMyNode 之后应该有括号,但这仍然可以编译。怎么会这样?

最佳答案

你实际上并没有调用函数,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 之后添加括号了。 - 因为那会调用函数,从而传递 Void (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

关于swift - 在 Swift 的 block 内运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com