使用对象的属性作为字典的键,从对象数组创建字典?

5
使用Swift,可以使用对象数组[Object]中的某个属性作为字符串键,从中创建[String:[Object]]字典,使用Swift的“map”函数实现此功能。
class Contact:NSObject {

   var id:String = ""
   var name:String = ""
   var phone:String = ""

   init(id:String, name:String, phone:String){
      self.id = id
      self.name = name
      self.phone = phone
   }

}

var contactsArray:[Contact]
var contactsDict:[String:Contact]

contactsDict = (contactsArray as Array).map { ...WHAT GOES HERE... }

在数组上调用map会返回另一个数组,因此没有... - dan
1
你可以使用 forEach 遍历数组并将值填充到字典中。正如 @dan 已经指出的那样,map 返回一个数组。 - CouchDeveloper
如果有比使用“map”更好的方法,我愿意尝试。 - ClayHerendeen
目前我只是在循环数组中的项并以此方式添加它们。我希望有一种更简洁的解决方案。 - ClayHerendeen
1
为什么你的 contactsDict[String: [Contact]] 呢?不应该是 [String: Contact] 吗?还有,用什么字段作为字典的键呢? - Code Different
是的,你说得对,应该是[String:Contact]。我在写问题时打错了。我正在使用Contact对象的"id"属性。 - ClayHerendeen
3个回答

7

假设您想将id用作字典的键:

var contactsArray = [Contact]()
// add to contactsArray

var contactsDict = [String: Contact]()
contactsArray.forEach {
    contactsDict[$0.id] = $0
}
< p > mapforEach 的区别在于,map 返回一个数组,而 forEach 不返回任何东西。


谢谢,forEach正是我正在寻找的。 - ClayHerendeen

2
您可以使用一行函数式代码中的reduce来实现此操作:
let contactsDict = contactsArray.reduce([String:Contact]()) { var d = $0; d[$1.id] = $1; return d; }

这也使得 contactsDict 不可变,这是在 Swift 中处理变量的首选方式。
或者,如果你想更加高级一些,可以重载字典的 + 运算符,并利用它:
func +<K,V>(lhs: [K:V], rhs: Contact) -> [K:V] {
    var result = lhs
    result[rhs.0] = rhs.1
    return result
}

let contactsDict = contacts.reduce([String:Contact]()) { $0 + ($1.id, $1) }

0

以下链接不存在。 - sandpat
我更新了上面的链接,以一个能适用于@Josh提到的该初始化程序的链接。 - Adnan S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接