以下哪项更好:
样本1:
var x: Int = 0
for _ in 1...5 {
someList.append( Foobar(someClosure: { println("X = \(x)") }))
}
Run Code Online (Sandbox Code Playgroud)
样品2:
var x: Int = 0
var c: ()->() = { println("X = \(x)") }
for _ in 1...5 {
someList.append( Foobar(someClosure: c))
}
Run Code Online (Sandbox Code Playgroud)
两个样本之间是否存在根本区别(除了写作风格)?
你在滥用"封闭"这个词.所有函数都是Swift中的闭包.所以你只是指"功能".
一个函数可以有一个名字.您展示的方式是为函数命名的一种方法:
var c: ()->() = { println("X = \(x)") }
Run Code Online (Sandbox Code Playgroud)
但这是另一种方式:
func c() {
println("X = \(x)")
}
Run Code Online (Sandbox Code Playgroud)
那就对了.声明函数只是为函数命名的一种方法.
但是,函数也可以是匿名的,这意味着它没有名称.这只是在不需要名称时缩短代码的一种方法,因为函数体可以在使用它的一个地方内联定义.你也展示了一个例子:
for _ in 1...5 {
someList.append( Foobar(someClosure: { println("X = \(x)") }))
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您想要或需要,请为函数命名,如果不想,则不要.这种或那种方式没有优势,劣势或差异.
除了一件事:匿名函数可以有一个捕获列表(定义从函数体外部捕获的类实例的内存管理,例如[weak self] in),但声明的函数不能.我认为这是语言中的一个错误,虽然不是一个非常严重的错误.