Swift设计者决定禁止函数类型的参数标签。
这种做法的原因在这里解释:https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md
这是一个令人沮丧和值得质疑的选择,因为禁止参数标签会使错误调用闭包变得更加容易,这比简化语言的类型系统更重要。
可用性 > 意识形态。
(isSuccess:Bool) -> Void
由于标签不允许,则我们可以有 typealias IsSuccess = Bool
并使用 (IsSuccess) -> Void
。 - Saran一个可考虑的解决方法。您无法执行:
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)
。你试图给元组元素两次打标签。 - sam-w我希望阅读这篇文章的人们可以在下面分享他们的反馈/评论,这样我就可以展示有其他人支持此举。
编辑: 我在这里提交了该提案:https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161010/028083.html 它似乎已经被接受。看起来这将会发生,但讨论的是是否将其作为Swift 4的改进提交(非常可能)。
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
})
completion: (_ success: Bool) -> Void