【问题标题】:Making a Dictionary in Swift用 Swift 制作字典
【发布时间】:2016-11-08 05:40:44
【问题描述】:

我有一个从 Parse 获取的对象,我想将它的列保存到 Dictionary 或其他东西(如果更好的话)。

我想要一个这样的字典:["name" : "Mike", "lastname" : "vorisis", "id" : "advsas"]

以下是我用来获取结果的代码:

func queryEvents() {
    let query = PFQuery(className: "eventController")
    query.limit = 1000
    query.includeKey("idEvent")
    query.includeKey("eventType")
    query.includeKey("idEvent.idMagazi")
    query.findObjectsInBackgroundWithBlock { (objects, error)-> Void in
        if let objects = objects  {
            for object in objects {
                var post = object["idEvent"] as? PFObject
                var post2 = post!["idMagazi"]
                print("retrieved related post: \(post2["name"]!)")
            }
        }
    }
}

【问题讨论】:

    标签: ios swift dictionary parse-platform


    【解决方案1】:

    可以使用此行制作字典:

    var dictionaryArray: [Dictionary<String,String,Int>] = []
    

    然后可以通过将值附加到字典来添加值。

    dictionaryArray.append(["name" : "Mike", "lastname" : "vorisis" , "id" : "advsas"])
    

    希望这会有所帮助。

    【讨论】:

    • 首先这是Array而不是Dictionary,其次因为参数太多无法编译。
    • 这是我认为需要使用的字典数组。如果不是,那么 iAnurag 的答案应该会更好。
    • 尽管如此,具有三种类型(keyvalue??)的通用 Dictionary 不起作用。
    • 命名一个数组变量 dictionary 会让耶稣宝宝哭泣。
    • 更新了,希望对你更好@redent84
    【解决方案2】:

    像这样创建字典:

    var dict = ["name" : "Mike", "lastname" : "vorisis" , "id" : "advsas"]
    

    var dict = Dictionary<String,String>
    dict.setValue("Mike", forKey: "name")
    

    【讨论】:

    • 停止使用setValue:forKey:,除非您确切知道为什么要使用 KVC。
    • @vadian 当然,没有必要使用 setValue,我只是展示了另一种设置值的方法。不过感谢您的提醒。
    • 除此之外,Swift Dictionary 根本不响应 setValue:forKey其他(更快捷)方式dict["name"] = "Mike"
    【解决方案3】:

    别的东西(如果更好的话)是一个自定义类。 将idMagazi的类型改为真实类型。

    class Event {
    
      let post : PFObject
      let name : String
      let idMagazi : String
    
      init(object : PFObject) {
        self.post = object
        self.name = object["name"] as! String
        self.idMagazi = object["idMagazi"] as! String
    
      }
    }
    

    并使用它

     ...
     if let objects = objects as? [PFObject]  {
        var events = [Event]()
        for object in objects {
    
          let post = Event(object: object)
          events.append(post)
          print("retrieved related post: \(post.name)")
        }
     }
     ...
    

    【讨论】:

      【解决方案4】:

      在 Swift 中,Dictionary&lt;T,V&gt; 等价于 [T: V]。如果未显式声明,则推断类型。

      空字典创建(全等价):

      var dict1: Dictionary<String, String> = [:]
      var dict2: [String: String] = [:]
      var dict3 = Dictionary<String, String>()
      var dict4 = [String: String]()
      

      带值的字典(全等价):

      var dict5 = ["Foo": "Bar", "Foo1": "Bar1", "Foo2": "Bar2"]
      var dict6: Dictionary<String, String> = ["Foo": "Bar", "Foo1": "Bar1", "Foo2": "Bar2"]
      var dict7: [String: String] = ["Foo": "Bar", "Foo1": "Bar1", "Foo2": "Bar2"]
      

      向现有字典添加值:

      dict["Foo"] = "Bar"
      

      在您的特定场景中,您可以使用:

      let dict = ["name" : name, "lastname" : lastname , "id" : id]
      

      其中namelastnameidString 变量。


      根据your own answer更新:

      有这个结构:

      struct Event {
          var nameEvent: String
          var nameMagazi: String
      }
      

      您可以使用这种方法,避免使用外部索引并使用数组而不是字典来存储结果。

      var events: [Event]?
      
      guard let objects = objects else { return }
      events = objects.map { object in
          let post = object["idEvent"] as? PFObject
          let post2 = post!["idMagazi"] as? PFObject
      
          let nameEvent = post!["name"] as! String
          let idEvent = post?.objectId
          let nameMagazi = post2!["name"] as! String
      
          return Event(nameEvent: nameEvent , nameMagazi: nameMagazi)
      }
      

      【讨论】:

      • 好奇:这些方法中的任何一种被认为是惯用的 Swift 吗?它们是否都编译为相同的底层程序集,还是一种创建空字典的方法以某种方式更高性能/更快?
      【解决方案5】:

      我终于知道该怎么做了。

      我使用我想要的结构:

      var userDictionary = [Int : Event]()
      struct Event {
              var nameEvent: String
              var nameMagazi: String
      
      
          }
      

      然后我用这个:

        if let objects = objects  {
                      for object in objects {
      
                          let post = object["idEvent"] as? PFObject
                          let post2 = post!["idMagazi"] as? PFObject
      
                          let nameEvent = post!["name"] as! String
                          let idEvent = post?.objectId
                          let nameMagazi = post2!["name"] as! String
      
                           self.events[self.i] = Event(nameEvent: nameEvent , nameMagazi: nameMagazi)
      
                          self.i += 1
                      }
                      print(self.events[1]!.nameEvent)
                  }
      

      谢谢大家的回答!

      【讨论】:

      • 如果结果中的元素少于 2 个,print(self.events[1]!.nameEvent) 将使您的应用程序崩溃。 self.events 应该是一个数组而不是一个以索引为键的字典。 self.i 可以是标准变量而不是实例属性。如果要使用索引进行迭代,可以使用for (index, object) in objects.enumerate() 而不是手动递增索引。
      猜你喜欢
      • 2014-12-14
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2017-07-16
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多