在 Swift 中的嵌套包装变量中获取值
Getting value in a nested wrapped variable in Swift
目前,我需要这段代码来让我的数据显示在 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,那么整个操作 return 为 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 应该把他的评论作为答案,这样我才能接受。 :)
您可以使用可选链接,如the Language Guide - Optional Chaining
中所述
struct Bar {
let baz: Int?
init(baz: Int) { self.baz = baz }
}
struct Foo {
let bar: Bar?
init(bar: Bar) { self.bar = bar }
}
let bar: Bar? = Bar(baz: 42)
let foo: Foo? = Foo(bar: bar!)
if let innerBaz = foo?.bar?.baz {
print(innerBaz) // 42
}
另请注意,您无需嵌套两个可选绑定子句(使用两个嵌套的 if
语句),但可以将它们作为两个(或多个)逗号分隔的可选绑定放在相同的 if
语句,其中第一个绑定 属性(如果成功)在后面的语句中可用。
/* ... as example above */
let dict = [42: "foobar!"]
if let innerBaz = foo?.bar?.baz, let dictValue = dict[innerBaz] {
print(dictValue) // foobar!
}
目前,我需要这段代码来让我的数据显示在 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,那么整个操作 return 为 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 应该把他的评论作为答案,这样我才能接受。 :)
您可以使用可选链接,如the Language Guide - Optional Chaining
中所述struct Bar {
let baz: Int?
init(baz: Int) { self.baz = baz }
}
struct Foo {
let bar: Bar?
init(bar: Bar) { self.bar = bar }
}
let bar: Bar? = Bar(baz: 42)
let foo: Foo? = Foo(bar: bar!)
if let innerBaz = foo?.bar?.baz {
print(innerBaz) // 42
}
另请注意,您无需嵌套两个可选绑定子句(使用两个嵌套的 if
语句),但可以将它们作为两个(或多个)逗号分隔的可选绑定放在相同的 if
语句,其中第一个绑定 属性(如果成功)在后面的语句中可用。
/* ... as example above */
let dict = [42: "foobar!"]
if let innerBaz = foo?.bar?.baz, let dictValue = dict[innerBaz] {
print(dictValue) // foobar!
}