草庐IT

swift - 在 Swift 中重用闭包

coder 2023-09-06 原文

以下哪个更好:

示例 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/

有关swift - 在 Swift 中重用闭包的更多相关文章

  1. ruby - Ruby 中的闭包和 for 循环 - 2

    我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对

  2. ruby-on-rails - 在 Rails 中分配和重用变量 - 设计模式 - 2

    我一直在使用相同的模式来返回json代码(参见下面的示例)。我正在收集照片并将其存储在变量中。如果存在标记参数,我将获得一个更具体的集合并将其重新分配给同一个变量。然后将其作为json返回。什么是更好的设计模式来实现同样的事情?photos=collection_of_photosifparams[:tag]photos=photos.find_all{|photo|somecondition}endrenderjson:photos 最佳答案 如果照片是ActiveRecord对象,您应该使用scope为您需要的确切数据生成适当的

  3. ruby - 如何 `break` 闭包中的外部循环(Proc,lambda)? - 2

    loop{break}可以正常工作,但是block=Proc.new{break}#or#block=lambda{break}loop(&block)#=>LocalJumpError:breakfromproc-closure是否可以在block变量中中断?更新:举例说明:defodd_loopi=1loopdoyieldii+=2endenddefeven_loopi=2loopdoyieldii+=2endend#Thisworkodd_loopdo|i|putsibreakifi>10end#Thisdoesn'tworkbreak_greater_10=Proc.newdo

  4. ruby-on-rails - 在多个 Rails 模型中重用方法 - 2

    此处为初学者ruby​​/rails问题。我有一个方法,我目前正在我的“用户”模型中使用。defgenerate_token(列)开始self[列]=SecureRandom.urlsafe_base64在User.exists时结束?(列=>self[列])结束我想在不同的模型中重复使用相同的方法,比如我的帐户模型。在哪里放置这样的代码以便在模型之间共享是个好地方?另外,为了获得调用类,我是否只使用“self.class”?谢谢 最佳答案 Rails4关注点就是为了完成这项工作。http://api.rubyonrails.org

  5. ruby-on-rails - Ruby On Rails - 重用错误消息部分 View - 2

    问题我试图在我的View中重用错误消息block。下面是positions/_error_messages.html.erb中写的blockTheformcontains.*问题是我必须在每个模型中创建类似的部分View,这有点像用不同的对象重复相同的代码,即@user、@client等。补救措施我在共享文件夹shared/_error_messages.html.erb中创建了一个erb并编写了以下代码。Theformcontains.*然后在查看文件中。positions/new.html.erb我写了下面的代码这意味着现在我可以在所有创建和更新操作中使用相同的代码。我想知道,这样

  6. ruby - 不同 Ruby 项目之间代码重用的最佳实践是什么? - 2

    伙计们!我是一名具有Java背景的软件开发人员,我正在使用Ruby网络框架(Padrino/Sinatra)开始一些项目。在我的java项目中,我通常有一些“公共(public)”项目,其类在多个项目中使用。例如,我有一个中央身份验证服务和一个存储用户配置文件的共享数据库。我所有使用此服务的项目都共享一些映射到用户配置文件数据库的模型。那么,尽管有框架、orm库等,跨多个Ruby项目共享代码的最佳方式是什么? 最佳答案 除此之外,ruby'sgems是重用代码公共(public)部分的最佳方式之一。Gem具有名称、版本号和描述,因此

  7. ruby - 在 Ruby 中定义一个闭包方法 - 2

    我正在用ruby​​重新定义对象中的方法,我需要新方法作为闭包。例如:defmess_it_up(o)x="blahblah"defo.to_sputsx#Wrong!xdoesn'texistshere,amethodisnotaclosureendend现在如果我定义一个Proc,它就是一个闭包:defmess_it_up(o)x="blahblah"xp=Proc.new{||putsx#Thisworksend#buthowdoIsetittoo.to_s.defo.to_sxp.call#sameproblemasbeforeendend有什么想法吗?谢谢。

  8. ruby-on-rails - Phusion Passenger 如何重用线程和进程? - 2

    我正在设置一个Apache2网络服务器,使用PhusionPassenger运行多个RubyonRails网络应用程序。我知道Passenger生成Ruby进程来处理请求。我有以下问题:如果必须同时处理多个请求,Passenger会生成多个进程还是多个(Ruby)线程?如何配置它以使其始终生成单线程进程?如果我有两个Rails应用程序,假设对应用程序A的请求进入进程1,然后对应用程序B的请求到达。进程1是否也可能处理此请求?什么时候以及如何做到这一点?换句话说,是否允许一个进程处理多个Rails应用程序的请求?我在多个URL和多个虚拟主机(例如http://和https://)中导出了

  9. ruby - Ruby 中的闭包 - 2

    我在闭包方面遇到了一些麻烦,我想知道是什么规范的make-adder过程的等效代码将在ruby。在计划中它会是这样的:(define(make-addern)(lambda(x)(+xn)) 最佳答案 其实很接近...defmake_addrnlambda{|x|x+n}endt=make_addr100t.call1101在1.9中你可以使用...defmake_addrn->(x){x+n}end 关于ruby-Ruby中的闭包,我们在StackOverflow上找到一个类似的问题:

  10. ruby-on-rails - 在哪里放置可重用的方法以供 rails 中的 Controller 访问 - 2

    我有几个从我的Controller调用的方法,感觉它们应该被拉出并放入Controller外部的可重用类中。人们通常把这些东西放在哪里?我知道我可以将它们放入我的ApplicationController,但如果我认为我可以稍后在其他应用程序中使用这些方法,那似乎不是一个很好的解决方案。此外,我的Controller中有许多实用方法可能不会在其他Controller中使用,或者将来根本不会使用,但我觉得它们只会让我的Controller膨胀一点。人们通常会为了清洁而将它们移到某个地方,还是最终会得到一个巨大的Controller?我来自Java和Actionscript,我只是为这些东

随机推荐