ios - 在 Swift 中获取嵌套包装变量的值

标签 ios swift null forced-unwrapping

目前,我需要此代码来让我的数据显示在 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:

所以最后它可以变成这样,消除一个嵌套 block :

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
}

另外,请注意,您不需要嵌套两个可选绑定(bind)子句(带有两个嵌套的 if 语句),但可以将它们作为两个(或多个)逗号分隔的可选绑定(bind)放置在同一个子句中。 if 语句,其中第一个绑定(bind)属性(如果成功)在后面的属性中可用。

/* ... as example above */

let dict = [42: "foobar!"]

if let innerBaz = foo?.bar?.baz, let dictValue = dict[innerBaz] { 
    print(dictValue) // foobar!
}

关于ios - 在 Swift 中获取嵌套包装变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39633154/

相关文章:

ios - AVCapturePhotoOutput - 设置不能重复使用

sql - 按列 ASC 排序,但首先是 NULL 值?

ios - 如何从ios中的字符串中快速获取高质量的条形码图像

java - find WithinHorizo​​n 方法返回 null

c++ - 为什么我的成员函数内的 "this"指针为空?

拍照时 iOS 应用程序崩溃

ios - 给表情符号着色 "image"

ios - 模拟器中的 Dropbox iOS 选择器

ios - 禁用 MPMoviePlayerController 中的控件

swift - UISearchBar的searchBarSearchButtonClicked不取消输入模式