gpt4 book ai didi

swift - 在 Swift 中重用闭包

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:39 25 4
gpt4 key购买 nike

以下哪个更好:

示例 1:

var x: Int = 0
for _ in 1...5 {
someList.append( Foobar(someClosure: { println("X = \(x)") }))
}

示例 2:

var x: Int = 0
var c: ()->() = { println("X = \(x)") }
for _ in 1...5 {
someList.append( Foobar(someClosure: c))
}
  • 如果我将闭包视为引用类型,那么 sample2 最好,因为我正在重用同一对象(减少内存分配,重用对象)。
  • 如果我将闭包视为值类型,那么它真的无关紧要。我必须相信编译器能够识别闭包是相同的并且它知道使用相同的闭包(类似于如果我在代码中的多个位置使用相同的文字字符串会发生什么)。选择一个而不是另一个将被视为“过早的优化”。

编辑:

两个样本之间是否存在根本差异(除了写作风格)?

最佳答案

您误用了“关闭”一词。 Swift 中的所有函数都是闭包。所以你的意思只是“功能”。

一个函数可以有一个名字。您显示的方式是一种给函数命名的方式:

var c: ()->() = { println("X = \(x)") }

但这里有另一种方式:

func c() {
println("X = \(x)")
}

没错。 声明函数只是为函数命名的一种方式。

然而,一个函数也可以是匿名的,这意味着它没有名字。这只是在不需要名称时使代码更短的一种方法,因为函数体可以在使用它的地方内联定义。你也展示了一个例子:

for _ in 1...5 {
someList.append( Foobar(someClosure: { println("X = \(x)") }))
}

因此,如果您想要或需要,请为函数命名,如果不需要,则不要命名。任何一种方式都没有优势、劣势或差异。

除了一件事:匿名函数可以有一个捕获列表(定义从函数体外部捕获的类实例的内存管理,例如 [weak self] in),但是一个声明的函数不能。我认为这是语言中的一个错误,尽管不是很严重。

关于swift - 在 Swift 中重用闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443707/

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