【问题标题】:Reusing closures in Swift在 Swift 中重用闭包
【发布时间】:2015-08-07 06:01:54
【问题描述】:

以下哪个更好:

样本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 将是最好的,因为我正在重用同一个对象(减少内存分配,重用对象)。
  • 如果我认为闭包是值类型,那么它真的没关系。我必须相信编译器能够识别闭包是相同的,并且它知道使用相同的闭包(类似于我在多个位置的代码中使用相同的文字字符串会发生的情况)。选择其中一个将被视为“过早的优化”。

编辑:

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

【问题讨论】:

  • 什么更好?这与在调用参数时询问创建Int 变量或使用文字值没有任何不同。可以说,在第一个示例中,您使用的是“闭包文字”,而在第二个示例中,您使用的是闭包变量。
  • @nhgrif 然后我想我是在问是否存在“闭包文字”之类的东西。在我看来,它们是否存在并不明显。它真的对闭包有影响吗?

标签: swift closures


【解决方案1】:

您误用了“关闭”一词。 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),但声明的函数不能。我认为这是语言中的一个错误,虽然不是很严重。

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 2018-03-16
    • 2015-03-04
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多