困惑于在iOS上实现iCloud行为的代码片段

时间:2015-06-29 09:56:51

标签: ios swift icloud

代码来自一本书。就整体应用程序架构(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背后的逻辑。一些澄清的想法将不胜感激。我一遍又一遍地读它,但它不跟我打勾。

1 个答案:

答案 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处理的数组中的当前项目)。