【问题标题】:Create dictionary from an array of objects using property of object as key for the dictionary?使用对象的属性作为字典的键从对象数组创建字典?
【发布时间】:2016-05-14 10:17:47
【问题描述】:

使用 Swift 是否可以使用对象数组 [Object] 创建一个 [String:[Object]] 字典,使用这些对象的属性作为字典的 String 键,使用 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会返回另一个数组,所以没有
  • 您可以使用forEach,然后用这些值填充字典。 map 返回一个数组 - 正如@dan 已经指出的那样。
  • 如果有比使用“地图”更好的方法,我对此持开放态度。
  • 目前我只是循环遍历数组中的项目并以这种方式添加它们。我只是希望有一个更简洁的解决方案。
  • 为什么你的contactsDict[String: [Contact]]。不应该是[String: Contact]。字典的键用什么字段?

标签: ios arrays swift dictionary


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢 forEach 正是我想要的。
【解决方案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) }

【讨论】:

    【解决方案3】:

    斯威夫特 4

    现在有一种直接的方法可以做到这一点:

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

    它是 Dictionary 的初始化器,可让您为 Collection 中的每个元素返回一个字符串键,指定它应如何在生成的 Dictionary 中分组。

    【讨论】:

    • 以下链接不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2012-08-31
    • 2021-12-05
    相关资源
    最近更新 更多