代码来自一本书。就整体应用程序架构(MVC)而言,它是模型的一部分。该模型有两个主要组成部分:
searches
NSUserDefaults
该应用会将这些数据保存在NSNotification.userInfo
(iOS默认系统)和iCloud上。当发出iCloud变化信号时,将调用以下方法。该参数是// 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{$0 != key}
updateUserDefaults(updateTags: true, updateSearches: true)
}
delegate.modelDataChanged() // update the view
}
}
bash -c "false; echo $?"
我的问题是for循环中的if - else。 for循环遍历已更改的键;用户添加新搜索,更新现有搜索或删除搜索。但是,我不明白if-else背后的逻辑。一些澄清的想法将不胜感激。我一遍又一遍地读它,但它不跟我打勾。
答案 0 :(得分:0)
if let query = keyValueStore.stringForKey(key)
表示如果 keyValueStore
包含与key
对应的字符串,则此字符串将分配给常量query
。
这称为“安全解包”:
在if let ...
条件中,使用saveQuery
安全地保存查询,因为使用if let ...
可以保证keyValueStore.stringForKey(key)
的值不会为零。
如果值为nil,那么在else
分支中,filter
方法用于更新tags
数组而不用我们刚刚处理的密钥:tags.filter{$0 != key}
表示“返回tags
中与key
不同的所有项目”($0
表示filter
处理的数组中的当前项目)。