似乎出于某种原因,Swift选择了通过强制用户删除完成处理程序参数标签来使其中的编码不易阅读。我已经阅读了Swift的讨论,但仍然认为这是一个错误。至少他们可以使它成为可选的。
使用Xcode 8进行构建时-是否有一种方法可以强制编译器使用Swift 2.3,因此我不再遇到这些错误?我已经更新了使用旧版Swift的选项(在构建设置下), 但仍然出现此错误:
函数类型不能带有参数标签“ isloggedIn”;使用'_'代替
如何将标签保留在完成处理程序中?
Answers:
Swift设计师决定禁止为函数类型使用参数标签。
原因在这里说明:https : //github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md
这是一个令人沮丧和可疑的选择,因为禁止参数标签使错误地调用闭包变得容易得多,这似乎比简化语言的类型系统更重要。
可用性>意识形态。
要考虑的解决方法。您不能:
func doStuff(completion: (foo: Int, bar: String) -> Void) {
...
completion(foo: 0, bar: "")
}
...但是您可以这样做:
func doStuff(completion: ((foo: Int, bar: String)) -> Void) {
...
completion((foo: 0, bar: ""))
}
即,在您的闭包中,有一个未命名的自变量,它是一个元组(foo: Int, bar: String)
。
以它自己的方式来看这很丑陋,但是至少您保留了参数标签。
(((imgData imgData: Data?, _ err: MYGR8TErrorClass?)) -> Void)
应该是(((imgData: Data?, err: MYGR8TErrorClass?)) -> Void)
。您正在尝试两次标记元组元素
根据上述信息,看来解决此问题并确保其性能的唯一方法是提出一项建议,以使参数标签为可选项,以期:
completionhandler: (newvalues, nil)
看起来更像是要管理的项目,而不是completionhandler(results: newValue, error:nil)
我希望阅读此书的人在提交此书之前可以在下面分享他们对此的反馈/评论,这样我可以表明还有其他人对此表示支持。
编辑:我已经在这里提交了音调:https : //lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161010/028083.html 这似乎已经被同意。看起来它即将发生,但是讨论的是这是否作为Swift 4改进提交(极有可能)
您必须使用_来使您的参数不命名,这很不幸。建议不要制作一个包装对象,而不是在每个参数上加上_然后盲目地调用您的函数。
由于丢失函数类型的命名参数会带来更大的风险,即您将使用错误的值调用函数,因此建议将这些参数包装在结构中,并将其作为函数的唯一参数。
这样,您的struct字段就会被命名,并且只有一种类型的值可以传递到函数中。比我们能够命名函数的参数要麻烦得多,但不能。至少这样,您会更安全,也不会感到肮脏。
struct LineNoteCellState {
var lineNoteText: String?
var printOnInvoice = false
var printOnLabel = false
}
这是一个使用示例:
cell.configure(editCallback: { (_ state: LineNoteCellState) in
self.lineNoteText = state.lineNoteText
self.printOnInvoice = state.printOnInvoice
self.printOnLabel = state.printOnLabel
})