在 iOS Swift 中实现方法时如何为闭包命名(语法问题)

Posted

技术标签:

【中文标题】在 iOS Swift 中实现方法时如何为闭包命名(语法问题)【英文标题】:How to give a name to a closure when implementing the method in iOS Swift (Syntax Question) 【发布时间】:2020-09-04 16:44:35 【问题描述】:

我在下面创建了这两种方法来注销用户。当 logout2(...) 被调用时,用户可以在 logout1() 运行之前对 anyFinalChanges 进行任何更改。

  private func logout1() 
    Cache.clearCache()
  
  
  func logout2(anyFinalChanges: () -> (), userLoggedOut: () -> ()) 
    anyFinalChangesInThisClosure()
    logout()
    userLoggedOut()
  

当我实现注销方法时,第二个闭包不显示名称

  .logOut2(anyFinalChanges: 

  )  //No Name here.. why is that?

  

我怎样才能使闭包的名称始终出现?

【问题讨论】:

这是 Swift 的尾随闭包语法。 docs.swift.org/swift-book/LanguageGuide/Closures.html#ID102你可以通过指定闭包的名称来调用你的方法,只是Xcode(我猜你使用Xcode)默认使用这种语法。 是的,我正在使用 xCode,但这可以解决问题,谢谢! 【参考方案1】:

当闭包是函数中的最后一个参数时,默认情况下会省略参数标签。但是,如果您愿意,可以添加它:

logout2(anyFinalChanges: 
    
, userLoggedOut: 
    
)

【讨论】:

哦,太好了!最后,我将把它变成一个 SDK 供其他人实现,所以我想如果他们愿意,他们可以添加它。【参考方案2】:

这可以说是 Swift 语言中的一个错误。规则是,如果您使用尾随闭包语法(将匿名函数放在方法调用的括号外),则第一个尾随闭包没有标签。在您的代码中只有一个尾随闭包,所以它是第一个闭包,并且没有标签。

Swift 的原始创建者克里斯·拉特纳 (Chris Lattner) 对这一选择表示遗憾,但此时它已融入语言,现在无能为力。

【讨论】:

这很有趣,我不知道。

以上是关于在 iOS Swift 中实现方法时如何为闭包命名(语法问题)的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift:如何从我的应用程序中实现“兑现”方法?

在类中实现委托(iOS/Swift)

在 swift (iOS) 中实现文档选择器

Swift 中实现 Promise 模式

如何在 Swift iOS 中实现 iMessage 渐变?

如何在 quickblox (Swift, iOS, xcode) 中实现发送图片