对在 iOS 上实现 iCloud 行为的代码片段感到困惑
Confused on snippet of code for implementing iCloud behavior on iOS
代码来自一本书。就整体应用程序架构 (MVC) 而言,它是模型的一部分。该模型有两个主要组成部分:
- 一组名为
tags
的标签
- 标签字典 - 名为
searches
的查询
应用程序将这些数据保存在 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
处理的数组中的当前项)。
代码来自一本书。就整体应用程序架构 (MVC) 而言,它是模型的一部分。该模型有两个主要组成部分:
- 一组名为
tags
的标签
- 标签字典 - 名为
searches
的查询
应用程序将这些数据保存在 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
处理的数组中的当前项)。