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

标签 swift

我在这段代码的 if let 行上遇到了臭名昭著的 fatal error :在解包可选值时意外发现 nil 错误:

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

原因是 rootShelf.childShelves 是一个 objective-c 类,它作为 var childShelves: NSMutableArray! 导入到 Swift 中! { get set },因此当我尝试将其转换为 [Shelf] 时,它可以等于 nil。我如何简洁地解开这个问题,而不需要很多额外的 if 或防护?我可以执行以下操作:

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

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

最佳答案

如果x类型为T! ,然后x as T其作用类似于强制展开。您可以使用x as T?继续将其视为可选。

所以在你的情况下,你可以这样做 return rootShelf.childShelves <b><i>as NSArray?</i></b> as? [Shelf] ?? [] .

关于swift - 在 Swift 中安全处理隐式解包选项的简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356506/

相关文章:

无需额外转换的 Swift Response 模板

arrays - 对包含另一个可选项目的可选项目数组进行排序

Swift:为什么我需要在声明中解包非可选变量

ios - 为什么 Interface Builder 不在身份检查器中显示 View Controller 子类?

arrays - Swift 4 按值复制内部有数组的对象数组

swift - 如何为 xib 文件内的元素设置圆角半径

objective-c - 在客户端处理分页 api

ios - iOS中如何通过CMMotionManager获取实际加速度

swift - 打印可选变量

ios - 由于 API key 无效(格式错误或丢失),操作失败