使用对象的属性作为字典的关键字从对象数组创建字典?
问题描述:
使用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... }
答
比方说,你想用id
作为字典的关键是:
var contactsArray = [Contact]()
// add to contactsArray
var contactsDict = [String: Contact]()
contactsArray.forEach {
contactsDict[$0.id] = $0
}
map
和forEach
之间的区别是,map
返回数组。 forEach
不会返回任何内容。
+0
感谢forEach是我正在寻找的。 – ClayHerendeen
答
您可以在一个行函数式代码通过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) }
答
斯威夫特4
现在有一个直接的办法这样的:
https://developer.apple.com/documentation/swift/dictionary/2919592-init
这对字典的初始化它允许您为Collection中的每个元素返回一个字符串键,指定应该如何将它分组到生成的Dictionary中。
对数组的调用映射返回另一个数组,因此没有 – dan
您可以使用'forEach',然后用值填充字典。 'map'返回一个数组 - 正如@dan已经指出的那样。 – CouchDeveloper
如果有更好的方式比使用“地图”即时通讯开放。 – ClayHerendeen