8

当我要为第二个视图触发我的 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!
}

这一切都有效,我永远不会收到由未包装的变量或 nil 值引起的任何错误。但是有没有更简单的方法呢?

现在感觉我检查的太多了

4

5 回答 5

12

我可以想到三个替代方案。

  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 ?? ""
    
于 2016-06-27T19:05:59.423 回答
8

您也可以使用DocsNil Coalescing Operator中给出的:

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

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

a != nil ? a! : b

于 2016-06-27T19:09:19.053 回答
2
if let time = time {
    timeLabel.text = "\(time)"
}

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

这和你的 JSON 一样

于 2016-06-27T18:57:22.227 回答
1

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

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

var time = 0
var title = ""

并设置标签

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

Swift 的强类型系统强烈推荐优先考虑

我可以在没有选项的情况下完成这个吗?

并且 - 如果没有其他选项 - 然后使用选项。

于 2016-06-27T18:59:24.537 回答
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。

于 2016-06-27T19:13:06.447 回答