当我要为第二个视图解雇我的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值而导致任何错误。但有没有更简单的方法呢?
现在觉得我检查的太多了
答案 0 :(得分:10)
我可以想到三种选择。
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
}
guard/let
。如果它们在setupViews()
之类的函数中,那么您可以像这样单行解包:
func setupViews() {
guard let time = time, let title = title else { return }
timeLabel.text = "\(time)"
titleLabel.text = title
}
您可以使用默认值和??
运算符快速展开。
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。