对在 iOS 上实现 iCloud 行为的代码片段感到困惑

Confused on snippet of code for implementing iCloud behavior on iOS

代码来自一本书。就整体应用程序架构 (MVC) 而言,它是模型的一部分。该模型有两个主要组成部分:

应用程序将这些数据保存在 NSUserDefaults(iOS 默认系统)和 iCloud 中。当收到 iCloud 中的更改信号时,将调用以下方法。参数是 NSNotification.userInfo

的实例
// add, update, or delete searches based on iCloud changes
func performUpdates(userInfo: [NSObject: AnyObject?]) {

    // get changed keys NSArray; convert to [String]
    let changedKeysObject = userInfo[NSUbiquitousKeyValueStoreChangedKeysKey]
    let changedKeys = changedKeysObject as! [String]

    // get NSUbiquitousKeyValueStore for updating
    let keyValueStore = NSUbiquitousKeyValueStore.defaultStore()

    // update searches based on iCloud changes
    for key in changedKeys {
        if let query = keyValueStore.stringForKey(key) {
            saveQuery(query, forTag: key, saveToCloud: false)
        } else {
            searches.removeValueForKey(key)
            tags = tags.filter{[=11=] != key}
            updateUserDefaults(updateTags: true, updateSearches: true)
        }

        delegate.modelDataChanged() // update the view
    }
}

我的问题是关于 for 循环中的 if - else。 for 循环遍历更改的键;用户添加新搜索、更新现有搜索或删除搜索。但是,我不明白 if-else 背后的逻辑。一些澄清的想法将不胜感激。我一遍又一遍地阅读它,但它不合我意。

if let query = keyValueStore.stringForKey(key)

表示如果keyValueStore包含一个对应key的字符串,那么这个字符串会被赋值给常量query

这叫做"safe unwrapping":

if let ... 条件中,使用 saveQuery 安全地保存查询,因为使用 if let ... 保证 keyValueStore.stringForKey(key) 的值不会为零。

如果值为nil,则在else分支中,使用filter方法更新tags数组没有我们刚刚处理的键:tags.filter{[=21=] != key} 表示 "return all items in tags that are different from key"([=24=] 表示由 filter 处理的数组中的当前项)。