在Swift中重用闭包

以下哪项更好:

样本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),但声明的函数不能.我认为这是语言中的一个错误,虽然不是一个非常严重的错误.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...