Swift中'_ in print()'的含义是什么?

时间:2018-07-19 11:27:20

标签: ios iphone swift cocoa-touch

嗨,我刚刚开始学习Swift。我只是学习ios开发的初学者。

func showOkay() {
    let title = NSLocalizedString("a title", comment: "")
    let message = NSLocalizedString("msg", comment: "")
    let cansal = NSLocalizedString("cancel", comment: "")
    let ok = NSLocalizedString("ok", comment: "")
    let alertController = UIAlertController (title: title, message: message, preferredStyle: .alert)

    let cancelAlertAction = UIAlertAction (title : cansal, style : .cancel) {
        _ in print("cancel") // i don't understand this line . its just a print or somthing else. why i cant use print here.
    }
    let okAction = UIAlertAction(title: ok , style : .default) {
        _ in print("ok") // i don't understand this line. its just a print or somthing else. why i cant use print here.
    }

    alertController.addAction(cancelAlertAction)
    alertController.addAction(okAction)
    present(alertController, animated: true, completion: nil)
}

@IBAction func btnAction(_ sender: Any) {
     showOkay()
}

如果我只使用print(),它们会给我像

一样的错误
  

无法将类型'()->()'的值转换为预期的参数类型'(((UIAlertAction)-> Void)?'

1 个答案:

答案 0 :(得分:2)

此语句使用结尾闭包语法{}之间的内容实际上是一个闭包,传递给UIAlertAction以便在事件发生时稍后调用。调用闭包时,它将传递所创建的UIAlertAction对象。

let cancelAlertAction = UIAlertAction (title : cansal , style : .cancel) {
    _ in print("cancel") \\ i don't understand this line . its just a print or somthing else . why i cant use print here.
}

如果您不打算使用警报措施,则需要_ in告诉Swift,您将忽略UIAlertAction,并且对此不进行任何操作。您是说,我知道有一个参数,但我忽略了它。

如果您未指定_ in,则Swift会将您的闭包类型推断为() -> ()类型,这意味着它什么也不做也不产生任何东西。这与您期望提供的闭包类型(UIAlertAction) -> Void不匹配(采用UIAlertAction并且不返回任何内容)。

通常这样写:

let cancelAlertAction = UIAlertAction (title : cansal , style : .cancel) { _ in
    print("cancel")
}

这样可以更清楚地了解_ in是闭包参数语法,并且与print语句不直接相关。