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 要求在完成处理程序中的返回值名称之前放置 _ [重复]的主要内容,如果未能解决你的问题,请参考以下文章