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

时间:2016-06-27 18:53:54

标签: swift swifty-json forced-unwrapping

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

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

if let aTitle = ads[indexPath.row]["title"].string {
    toView.title = aTitle
}

在第二个VC中,我宣布了类似的变量:

var time: Int?
var title: String?

这就是我打开值的方式:

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

if title != nil {
   titleLabel.text = title!
}

这一切都有效我永远不会因为展开的varibles或nil值而导致任何错误。但有没有更简单的方法呢?

现在觉得我检查的太多了

5 个答案:

答案 0 :(得分:10)

我可以想到三种选择。

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

    if let time = time {
        timeLabel.text = "\(time)"
    }
    
    if let title = title {
        titleLabel.text = title
    }
    

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

    if let time = time, let title = title {
        timeLabel.text = "\(time)"
        titleLabel.text = title
    }
    
  2. guard/let。如果它们在setupViews()之类的函数中,那么您可以像这样单行解包:

    func setupViews() {
        guard let time = time, let title = title else { return }
        timeLabel.text = "\(time)"
        titleLabel.text = title
    }
    
  3. 您可以使用默认值和??运算符快速展开。

    timeLabel.text = "\(time ?? 0)"
    titleLabel.text = title ?? ""
    

答案 1 :(得分:7)

您也可以使用Docs中提供的Nil Coalescing Operator

  

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

中的类型相匹配      

nil coalescing运算符是下面代码的简写:

     

a != nil ? a! : b

答案 2 :(得分:2)

if let time = time {
    timeLabel.text = "\(time)"
}

if let title = title {
    titleLabel.text = title
}

与你的JSON相同

答案 3 :(得分:1)

是的,你检查的太多了(两次)。

由于只传递了非可选值,因此您可以将变量声明为非可选

var time = 0
var title = ""

并设置标签

timeLabel.text = "\(time)"
titleLabel.text = title

Swift的强类型系统强烈建议首先考虑

  

我可以在没有选项的情况下完成此任务吗?

和 - 如果没有其他选择 - 那么使用选项。

答案 4 :(得分:1)

您不需要在第一个视图中检查nil条件。 请按照以下代码:

toView.time = ads[indexPath.row]["unix_t"] as? Int

toView.title = ads[indexPath.row]["title"] as? String

第二个视图中的

时间和标题变量是选项。因此,当您为toView.time和toView.title分配值时,它将分别分配类型time和title的值或nil。