我在这段代码的 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/