通过“带参数的功能”作为参数

时间:2018-12-26 20:20:25

标签: swift

无法编译

func showAlert(_ title: String, message: String, 
  onOk: (()->())? = nil,
  onAnotherAction:((anotherActionTitle : String)-> Void)? = nil) {
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)

    let ok = UIAlertAction(title: "OK", style: .default) { (action) in
        onOk?()
    }

    let anotherAction = UIAlertAction(title: anotherActionTitle, style: .default) { (action) in
        onAnotherAction?()
    }

    alertController.addAction(ok)
    alertController.addAction(anotherAction)

    ...
}

此编译

func showAlert(_ title: String, message: String,
  onOk: (()->())? = nil,
  onAnotherAction:((String)-> Void)? = nil)

但是,我必须为 onAnotherAction()的标题 anotherActionTitle 声明另一个参数。

有没有办法使第一种方法起作用?谢谢!

2 个答案:

答案 0 :(得分:0)

由于SE-0111是Swift 3的一部分,因此不再可能为闭包类型使用命名参数。

Swift核心团队制定了一个概念路线图,用于在将来的某个时刻恢复命名的闭包参数,但是我不知道实现的时间表:

https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160711/024331.html

答案 1 :(得分:0)

  

但是,我必须为anotherActionTitle的标题onAnotherAction()声明另一个参数

不,您不必这样做。只需将其作为整个函数的常规参数即可:

func showAlert(_ title: String, message: String,
               onOk: (()->())? = nil,
               anotherActionTitle: String? = nil,
               onAnotherAction: (()->())? = nil) {

函数的其余部分将随后编译并正常工作。