在 swift 中解包多个可选值

Unwrap multiple optionals in swift

我现在正在做一个 Swift 项目,我在开发应用程序的同时学习这门语言。我正在尝试创建一个函数来调用“警报弹出窗口”,并对可选展开有疑问。

func showAlert(title: String?, message: String?, actions: [UIAlertAction], style: UIAlertController.Style) {
    let title = title ?? nil
    let message = message ?? nil

    print("alert \(title), \(message),") // get optional value or nil, not String and nil...
        
    let alert = UIAlertController(title: title, message: message, preferredStyle: style)
    actions.forEach { alert.addAction([=11=])}
    present(alert, animated: true)
}

因为我需要在应用程序中显示多个警报弹出窗口,所以我创建了一个自定义函数“showAlert”,我想像下面的代码一样调用这个函数。

showAlert(title: "delete", message: nil, actions: [deleteAction], style: .alert)

问题是标题和消息值可以是字符串或 nil(例如...警报控制器只显示标题但显示消息),所以我需要澄清标题和消息是否包含值。

我想在这里做的是,检查标题和消息值,并将 String 或 nil 应用到这部分,let alert = UIAlertController(title: title, message: message, preferredStyle: style)。 我阅读了一些关于可选绑定的文章,但是如果我使用它来编写这段代码,

func showAlert(title: String?, message: String?, actions: [UIAlertAction], style: UIAlertController.Style) {

    if let title = title, let message = message {
        print("alert \(title), \(message),") // get optional value
        
        let alert = UIAlertController(title: title, message: message, preferredStyle: style)
        actions.forEach { alert.addAction([=13=])}
        present(alert, animated: true)
    }
}

我只能处理title是String,message是String的情况。 我也想关心标题为零但消息为字符串,或标题为字符串且消息为零的情况。

那么我如何编写代码,在 showAlert 的标题和消息中使用 String 或 nil,并在这部分应用 String 或 nil,UIAlertController(title: title, message: message, preferredStyle: style)?

您无需执行任何操作。 UIAlertController.init(title:message:preferredStyle:) 有以下签名。

convenience init(title: String?, 
         message: String?, 
  preferredStyle: UIAlertController.Style)

titlemessage 都已经是 String? 类型,因此您可以传递在函数参数中接收到的任何内容,而无需像在第一个版本中那样检查任何选项.

func showAlert(title: String?, message: String?, actions: [UIAlertAction], style: UIAlertController.Style) {
    // Notice how the redundant declarations in your version have been removed
    print("alert \(title), \(message),") // get optional value or nil, not String and nil...
        
    let alert = UIAlertController(title: title, message: message, preferredStyle: style)
    actions.forEach { alert.addAction([=11=])}
    present(alert, animated: true)
}