以下哪项更好: 样本1: var x: Int = 0for _ in 1...5 { someList.append( Foobar(someClosure: { println("X = \(x)") }))} 样品2: var x: Int = 0var c: ()-() = { println("X = \(x)") }for _ in 1...5 { someList.append( Foobar(someClos
样本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),但声明的函数不能.我认为这是语言中的一个错误,虽然不是一个非常严重的错误.