什么是在Swift中安全处理隐式解包的选项的简洁方法?

时间:2016-05-20 22:03:40

标签: swift

我在此代码中的fatal error: unexpectedly found nil while unwrapping an Optional value行上收到了臭名昭着的if let错误:

var displayShelves: [Shelf] {
    get {
        if let shelves = rootShelf.childShelves as NSArray as? [Shelf] {
            return shelves
        }
        return []
}

原因是rootShelf.childShelves是一个客观的C类,它被导入到Swift中var childShelves: NSMutableArray! { get set },因此当我尝试将其转换为[Shelf]时,它可以等于{ {1}}。如何简洁地解开这个,没有太多额外的ifs或警卫?我可以做到以下几点:

nil

但这是可选链接应该阻止的那种代码!那么,有没有一种Swift-y方法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

rootShelf.childShelves nil时,以下内容不会崩溃:

var displayShelves: [Shelf] {
    get {
        if rootShelf.childShelves != nil, let shelves = rootShelf.childShelves as NSArray as? [Shelf] {
            return shelves
        }
        return []
    }
}

我并非100%确定,运算符可以保证像这样短路。

答案 1 :(得分:0)

如果x的类型为T!,那么x as T就像强制解包一样。您可以使用x as T?继续将其视为可选。

因此,在您的情况下,您可以执行return rootShelf.childShelves as NSArray? as? [Shelf] ?? []