2016-02-04 95 views
2

使用Swift,可以使用swift的“map”,使用这些对象的属性作为字典的字符串键,从一组对象[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... } 
+0

对数组的调用映射返回另一个数组,因此没有 – dan

+1

您可以使用'forEach',然后用值填充字典。 'map'返回一个数组 - 正如@dan已经指出的那样。 – CouchDeveloper

+0

如果有更好的方式比使用“地图”即时通讯开放。 – ClayHerendeen

回答

5

比方说,你想用id作为字典的关键是:

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

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

mapforEach之间的区别是,map返回数组。 forEach不会返回任何内容。

+0

感谢forEach是我正在寻找的。 – ClayHerendeen

1

您可以在一个行函数式代码通过reduce实现这一目标:

let contactsDict = contactsArray.reduce([String:Contact]()) { var d = $0; d[$1.id] = $1; return d; } 

这也保持不变contactsDict,这是处理在斯威夫特变量的首选方法。

或者,如果你想获得幻想,你可以重载+运营商的字典和利用是:

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