在给定不同字段的键的情况下从字典中获取值

时间:2017-10-30 06:03:32

标签: ios arrays swift dictionary

我正在使用第三方库SwiftAddressBook在我的应用中使用通讯录。我想迭代设备中的联系人并提取一些特定值。即Twitter和facebook用户名(如果存在)。

SwiftAddressBook有一个名为SwiftAddressBookPerson的对象,代表一个联系人。 SwiftAddressBookPerson对象有一个名为socialProfiles的属性,其中包含一个字典数组。每个字典都包含有关可用社交媒体帐户的信息,例如用户名,网址等。打印socialProfiles的值如下所示。

[
    SwiftAddressBook.MultivalueEntry<Swift.Dictionary<SwiftAddressBook.SwiftAddressBookSocialProfileProperty, Swift.String>>(value: [
    SwiftAddressBook.SwiftAddressBookSocialProfileProperty.url: "http://twitter.com/isuru", 
    SwiftAddressBook.SwiftAddressBookSocialProfileProperty.username: "isuru", 
    SwiftAddressBook.SwiftAddressBookSocialProfileProperty.service: "twitter"], 
    label: nil, id: 0),

    SwiftAddressBook.MultivalueEntry<Swift.Dictionary<SwiftAddressBook.SwiftAddressBookSocialProfileProperty, Swift.String>>(value: [
    SwiftAddressBook.SwiftAddressBookSocialProfileProperty.url: "http://www.facebook.com/isuru", 
    SwiftAddressBook.SwiftAddressBookSocialProfileProperty.username: "isuru", 
    SwiftAddressBook.SwiftAddressBookSocialProfileProperty.service: "facebook"], 
    label: Optional("facebook"), id: 1)
]

我通过这样做socialProfiles.map { $0.map { $0.value } }清理了一下,输出了以下内容。

[
    [
        SwiftAddressBook.SwiftAddressBookSocialProfileProperty.url: "http://twitter.com/isuru", 
        SwiftAddressBook.SwiftAddressBookSocialProfileProperty.username: "isuru", 
        SwiftAddressBook.SwiftAddressBookSocialProfileProperty.service: "twitter"
    ],
    [
        SwiftAddressBook.SwiftAddressBookSocialProfileProperty.url: "http://www.facebook.com/isuru", 
        SwiftAddressBook.SwiftAddressBookSocialProfileProperty.username: "isuru", 
        SwiftAddressBook.SwiftAddressBookSocialProfileProperty.service: "facebook"
    ]
]

我现在想要的是服务的名称(twitter,facebook),检索用于该服务的用户名。

如何解析字典并获取其他字段的值?

2 个答案:

答案 0 :(得分:0)

鉴于这是一个数组,我使用first { $0.service == serviceName }

或者,您可以提前遍历整个数组,以创建一个字符,其中key为serviceName,value为profile属性。这种方法的优点是后续查找会更快。

答案 1 :(得分:0)

我已将您的快速地址簿词典数组命名为profiles。 flatMap调用中的强制解包是安全的,因为在前一个过滤器调用中,key和value都是非nil测试的。

结果是一个字典,其中包含interestingServices数组中列出的服务的用户名值。

let service = SwiftAddressBook.SwiftAddressBookSocialProfileProperty.service
let username = SwiftAddressBook.SwiftAddressBookSocialProfileProperty.username

let interestingServices = ["facebook", "twitter"]
let usernames = profiles
  .filter {
    guard
      let service = $0[service],
      $0[username] != nil
    else {
      return false
    }
    return interestingServices.contains(service)
  }
  .flatMap { profile in
    return [profile[service]!, profile[username]!]
  }

enter image description here