Xcode 要求在完成处理程序中的返回值名称之前放置 _ [重复]

Posted

技术标签:

【中文标题】Xcode 要求在完成处理程序中的返回值名称之前放置 _ [重复]【英文标题】:Xcode requires to put _ before return value name in completion handler [duplicate] 【发布时间】:2018-07-26 02:42:18 【问题描述】:

我有一个完成处理函数,返回值中有一个字符串。

func hardProcessingWithString(input: String, completion: (result: String) -> Void) 

但是,Xcode 要求我将 _ 放在我的返回值名称之前,所以我必须将 _ 放在结果之前

func hardProcessingWithString(input: String, completion: (_ result: String) -> Void) 

因此,当我调用我的函数时,我的返回值没有名称,而是显示了这个

hardProcessingWithString(input: String, completion: (String) -> Void)

有没有办法代替显示

completion: (String) -> Void)

我想让它显示

completion: result -> Void)

以便我确切地知道返回值的含义而不是完成类型。谢谢!

【问题讨论】:

这个 Swift 特性之前已经在一些帖子中讨论过,记住它是从 Swift 3.2 开始的,我觉得它也很糟糕,但是现在没有办法显示参数名称。 【参考方案1】:

由于某些版本的 Swift,闭包类型不能有参数名称。但是,有一个解决方法:

typealias Result = String

现在您可以使用Result 作为闭包类型:

func f(completion: (Result) -> Void)  ... 

Foundation 中的许多方法也这样做。例如TimeInterval 只是Double 的别名,但将其命名为TimeInterval 会使目的更明确。

【讨论】:

不能说我是这个的粉丝,除非上下文使数据类型绝对清楚。 我尝试了您的建议,但返回值还包括我声明类型别名的视图控制器名称。你也有这个问题吗?我看起来像这样的“ViewControllerName.Result” 您需要在全局范围内声明 typealias,而不是在任何 VC 内。 @KevinVuD 是的。谢谢【参考方案2】:

这是设计使然(当然,不是每个人都喜欢它)。见

https://bugs.swift.org/browse/SR-2894

正如乔丹·罗斯解释的那样:

这是正确的行为。参数标签被认为是函数名称的一部分,而不是其类型。函数值/闭包只有基本名称,没有参数标签,因此无法指定。

【讨论】:

【参考方案3】:

您不应该为闭包定义添加标签。就这样定义吧。

func hardProcessingWithString(input: String, completion: (String) -> Void) 

调用此函数时,应定义标签。

hardProcessingWithString(input: "")  (result) in


【讨论】:

以上是关于Xcode 要求在完成处理程序中的返回值名称之前放置 _ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在完成处理程序中使用返回值?

XCode 没有在自动完成中提供任何有用的信息

如何防止 onCreate 在 doAsync 完成之前返回结果

拖放控制台应用程序的事件处理程序

方法在完成处理程序之前返回

swift 3 和 Xcode 8 中的完成处理程序错误