我正在使用第三方库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),检索用于该服务的用户名。
如何解析字典并获取其他字段的值?
答案 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]!]
}