完成处理程序是iOS中常用的设计模式。
考虑这种常见情况:
我需要获取一个JSON字符串。如果失败,我将返回错误。我设置了这样的提取调用:
func getData(completionHandler: @escaping (_ jsonString: String?, _ error: String?) -> Void) {
}
然后调用此函数我们得到了这个:
getData { (<#String?#>, <#String?#>) in
<#code#>
}
//<#stuff#> represents an auto-complete placeholder in xcode
所以我们有两个参数包含数据和错误。两者都可选。 哪一个是哪个?据说Swift 3专注于在使用点上创造清晰度,但就在这里......我不知道哪一个是哪个。任何不熟悉此代码的人最终都会犯错误
所以我尝试通过删除'_'
或添加如下标签来明确标记参数:
func getData(completionHandler: @escaping (json jsonString: String?, theError error: String?) -> Void) {
}
但是,我收到这些错误:
Function types cannot have argument label 'json' use '_' instead
Function types cannot have argument label 'theError' use '_' instead
我希望能够做的是明确命名这些参数,或者至少在我设置呼叫时在自动完成中查看其标签。
基本上, 当我输出电话时,我会得到这个:
getData { (<#jsonString: String?#>, <#theError: String?#>) in
<#code#>
}
或
getData { (jsonString, theError) in
<#code#>
}
如果不为每个闭包类型创建typealias
,我想不到这样做,这看起来很荒谬
有没有办法做我想要的事情? 当此功能被杀死时,是否考虑了这种情况?
这似乎违背了所有的智慧:https://swift.org/documentation/api-design-guidelines/