【发布时间】:2016-09-22 07:44:28
【问题描述】:
目前,我需要这段代码来让我的数据显示在 UITableViewCell 标签上:
guard let leaseUnits = Data.leaseUnits else { return cell; }
guard let leaseUnit = leaseUnits[indexPath.row] else { return cell; }
guard let unitId = leaseUnit.unitId else { return cell; }
guard let units = Data.units else { return cell; }
guard let unit = units[unitId] else { return cell; }
(cell.viewWithTag(1)! as! UILabel).text = unit.unitNumber;
或者我可以这样做,但有空运行时错误的风险:
let unitNumber = Data.units![Data.leaseUnits![indexPath.row]!.unitId]!.unitNumber;
(cell.viewWithTag(1)! as! UILabel).text = unitNumber;
有什么办法可以让它变成这样:
let unitNumber = Data.units?[Data.leaseUnits?[indexPath.row]?.unitId]?.unitNumber;
if (unitNumber != nil) { (cell.viewWithTag(1)! as! UILabel).text = unitNumber!; }
我只想得到一个值,如果任何链数据检索为 nil,则只为整个操作返回一个 nil。
编辑:
好的,从 dfri 的评论来看:我至少可以像这样简化它:
if let unitId = Data.leaseUnits?[indexPath.row]?.unitId {
if let unitNumber = Data.units?[unitId]?.unitNumber {
(cell.viewWithTag(1)! as! UILabel).text = unitNumber;
}
}
没有比这更简单的了。
我想这已经足够了。现在我更了解了可选链的局限性。
编辑 2:
所以最后可以变成这样,去掉一个嵌套块:
if let unitId = Data.leaseUnits?[indexPath.row]?.unitId,
let unitNumber = Data.units?[unitId]?.unitNumber {
(cell.viewWithTag(1)! as! UILabel).text = unitNumber;
}
IMO,dfri 应该将他的评论作为答案,以便我接受。 :)
【问题讨论】:
-
查看可选链接(
if let a?.b?.c { ... }其中a、b和c都是可选的)。 -
@dfri 等等,这仅在 Swift 3 上可用吗?
-
可选链接至少从 Swift 2 开始就已经存在(当我加入火车时),甚至可能更长。请参阅the e.g. post in it on the SO doc. page for Swift,或参考官方语言指南。
-
所以你的意思是我这样做:
if let unitNumber = Data.units?[Data.leaseUnits?[indexPath.row]?.unitId]?.unitNumber { do something }? -
请注意,您不需要嵌套两个可选绑定子句,但可以将它们作为两个逗号分隔的可选绑定放在同一个
if语句 (if let foo = a?.b?.c, let bar = bax[foo] { ... }) 中,其中第一个绑定属性(如果成功)可在以下之一中找到。
标签: ios swift null forced-unwrapping