swift - 处理困惑的 swift optionals

标签 swift

我正在编写一些应该非常简单的 Swift 代码:初始化数据库类,如果可用则从文件加载数据,否则返回空数据库。

问题是,我的代码似乎过于复杂,我认为可能有更好的方法来处理我看不到的可选值。

以下是我的做法与我希望的做法:

我是怎么做的

class Database: NSObject
{
    private var database:    [String: [AnyObject]]
    private var databasePath: String

    init(databasePath: String)
    {
        self.databasePath = databasePath

        if let db1 = NSKeyedUnarchiver.unarchiveObjectWithFile(databasePath)
        {
            if let db2 = db1 as? [String : [AnyObject]]
            {
                database = db2
            }
            else
            {
                database = [String: [AnyObject]]()
            }
        }
        else
        {
            database = [String: [AnyObject]]()
        }

        super.init()
    }
}

我希望它变成什么样

class Database: NSObject
{
    private var database:    [String: [AnyObject]]
    private var databasePath: String

    init(databasePath: String)
    {
        self.databasePath = databasePath

        if !(let database = NSKeyedUnarchiver.unarchiveObjectWithFile(databasePath) as? [String : [AnyObject]])
        {
            database = [String: [AnyObject]]()
        }

        super.init()
    }
}

我错过了什么?

最佳答案

可以简化为

if let db = NSKeyedUnarchiver.unarchiveObjectWithFile(databasePath) as? [String : [AnyObject]] {
    database =  db
} else {
    database = [:]
}

甚至是单个语句,使用“nil-coalescing operator”??:

database = NSKeyedUnarchiver.unarchiveObjectWithFile(databasePath) as? [String : [AnyObject]] ?? [:]

这计算出第一个表达式

NSKeyedUnarchiver.unarchiveObjectWithFile(databasePath) as? [String : [AnyObject]]

如果那不是nil,否则到空字典[:]

关于swift - 处理困惑的 swift optionals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31803897/

相关文章:

swift - 在 SwiftUI 中的 ActionSheet 上设置辅助功能标识符

ios - 在加载 View iOS 之前从 Firebase 检索数据

ios - 在 Swift 中旋转文本

ios - Swift 中的 JSQMessagesViewController 与 Xcode 6.3 Objective-C 选择器问题

swift - 如何自动删除tableviewcell

ios - 本地化界面生成器 Storyboard在 Xcode 10 中不起作用

swift - UICollectionViewFlowLayout.scrollingDirection 改变强制重新加载 - Swift 4

swift - 如何在 Swift 中重新解释_cast?

ios - 保存由结构体对象数组组成的 Realm 列表

ios - objective-c projet : join room 中的 Socket iOS swift 客户端