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

时间:2016-02-04 17:06:25

标签: ios arrays swift dictionary

使用Swift是否可以使用swift的“map”使用这些对象的属性作为字典的String键从对象数组[Object]创建[String:[Object]]的字典?

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... }

3 个答案:

答案 0 :(得分:6)

我们假设你想用id作为字典的关键词:

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

var contactsDict = [String: Contact]()
contactsArray.forEach {
    contactsDict[$0.id] = $0
}

mapforEach之间的区别在于map返回一个数组。 forEach不会返回任何内容。

答案 1 :(得分:1)

您可以通过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) }

答案 2 :(得分:1)

Swift 4

现在可以直接这样做了:

https://developer.apple.com/documentation/swift/dictionary/2919592-init

它是Dictionary的初始化程序,它允许您为Collection中的每个元素返回一个字符串键,指定如何在生成的Dictionary中对其进行分组。