Xcode 8:函数types不能有参数标签打破我的构build

看起来由于某些原因,Swift已经select通过强制用户删除完成处理程序参数标签来使其中的编码更不易读。 我已经阅读了Swift的讨论,但仍然认为这是一个错误。 至less他们本来可以select的。

当使用Xcode 8编译时 – 是否有办法强制编译器使用Swift 2.3,这样我就不会再遇到这些错误了? 我已经更新了使用传统Swift的选项(在构build设置下) 在xcode中的传统支持 但我似乎仍然得到这个错误:

函数types不能有参数标签“isloggedIn”; 用“_”代替

错误Xcode 8

我如何在我的完成处理程序中保留我的标签?

Swiftdevise者决定禁止函数types的参数标签。

推理在这里解释: https : //github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md

这是一个令人沮丧和可疑的select,因为禁止参数标签使错误地调用闭包更容易,这比简化语言的types系统更重要。

可用性应该抢先于意识形态。

要考虑的解决方法。 你不能这样做:

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)

这是丑陋的,但至less你保留了争论的标签。

免责声明:我没有想到这种方法的捕获或性能影响。

根据上面的信息 – 看来只有这样才能真正解决这个问题,并确保其性能是提出一个build议,使参数标签可选,以便:

  1. 提高了开发速度(没有参数标签,每次我们把完成处理程序放到方法的顶部,我们就需要向上滚动。
  2. 减less错误:(我已经有一些错误,由于不完整的处理程序条目,特别是那些期望布尔值)
  3. 使代码在团队成员中更具可读性。 不是每个人都只有一个团队成员,因此能够轻松地拿起别人的代码是必须的。
  4. 最后,良好的编程习惯意味着解决scheme看起来应该和正在开发的实际项目一样。 completionhandler: (newvalues, nil)看起来不像被处理的项目比completionhandler(results: newValue, error:nil)

我希望读者能够在提交之前分享他们对此的反馈/评论,以便我可以显示其他人支持这一点。

编辑:我已经在这里提交的音调: https : //lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161010/028083.html似乎已经同意。 看起来似乎会发生,但讨论的是这是否作为Swift 4改进(极有可能)

你必须使用_来使你的参数无名,这是不幸的。 而不是粘到每个参数,然后盲目地调用你的函数,我会build议做一个包装对象。

由于失去函数types的命名参数引入更多的风险,你会调用错误值的函数,我build议将参数包装在一个结构中,并将其作为函数的唯一参数。

这样你的结构域被命名,只有一种types的值传入你的函数。 这比我们能够命名函数的参数更麻烦,但是我们不能。 至less这样,你会更安全,你会觉得不那么肮脏。

 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