斯威夫特安全地解开视觉字符串和整数

use*_*197 7 swift forced-unwrapping swifty-json

当我要为第二个视图解雇我的segue时,我也会发送一些像这样的值:

if let aTime = ads[indexPath.row]["unix_t"].int {
    toView.time = aTime
}

if let aTitle = ads[indexPath.row]["title"].string {
    toView.title = aTitle
}
Run Code Online (Sandbox Code Playgroud)

在第二个VC我宣布变量如下:

var time: Int?
var title: String?
Run Code Online (Sandbox Code Playgroud)

这就是我解开值的方式:

if time != nil {
   timeLabel.text = String(time!)
}

if title != nil {
   titleLabel.text = title!
}
Run Code Online (Sandbox Code Playgroud)

这一切都有效我从来没有得到任何由未包装的varibles或nil值引起的错误.但有没有更简单的方法呢?

现在感觉我检查太多了

kei*_*ter 10

我可以想到三种选择.

  1. if/let.与您当前的选项非常相似,但您不必隐式解包.

    if let time = time {
        timeLabel.text = "\(time)"
    }
    
    if let title = title {
        titleLabel.text = title
    }
    
    Run Code Online (Sandbox Code Playgroud)

    你甚至可以在同一条线上打开它们.这样做的缺点是,如果其中一个是nil,那么两个标签都不会被设置.

    if let time = time, let title = title {
        timeLabel.text = "\(time)"
        titleLabel.text = title
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. guard/let.如果这些功能类似setupViews(),那么您可以像这样单行解包:

    func setupViews() {
        guard let time = time, let title = title else { return }
        timeLabel.text = "\(time)"
        titleLabel.text = title
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以使用默认值和??操作员快速解包.

    timeLabel.text = "\(time ?? 0)"
    titleLabel.text = title ?? ""
    
    Run Code Online (Sandbox Code Playgroud)


Der*_*123 7

您也可以使用文档中Nil Coalescing Operator给出的内容:

如果a包含值,则nil合并运算符(a ?? b)展开可选a;如果a为n,则返回默认值b.表达式a始终是可选类型.表达式b必须与存储在a中的类型匹配.

nil合并运算符是以下代码的简写:

a != nil ? a! : b