【问题标题】:Skip over null arrays in Swift?跳过 Swift 中的空数组?
【发布时间】:2017-05-16 10:29:01
【问题描述】:

抱歉,我不太清楚如何表达这个问题。所以我确切地知道问题是什么。我正在阅读几个 plist。一些 plist 没有存储在“evolved_species_id”中的 Array,这给出了错误

索引超出范围

如何让我的代码跳过没有存储数组的“evolved_species_id”实例?这是我用来获取数据的代码。

convenience init(fromDict dict: [String:Any]) {
    let ef = dict["evolves-from"] as? [[String:Any]]
    let ef1 = ef?[0]["evolved_species_id"]
    self.init(
        prevo: ef1 as? Int ?? 0,
    )

}

它永远不会到达 self.init 行,因为控制台错误是在 let ef1 = ef?[0]["evolved_species_id"] 创建的

【问题讨论】:

    标签: ios arrays swift indexing


    【解决方案1】:

    你可以检查数组是否存在并且不为空

    convenience init(fromDict dict: [String:Any]) {
        let ef1 : Int
        if let ef = dict["evolves-from"] as? [[String:Any]], !ef.isEmpty {
            ef1 = ef[0]["evolved_species_id"] as! Int
        } else {
            ef1 = 0
        }
        self.init(
            prevo = ef1 // the colon syntax won't compile most likely.
        )
    }
    

    或使用可失败的初始化程序

    convenience init?(fromDict dict: [String:Any]) {
    
        guard let ef = dict["evolves-from"] as? [[String:Any]], !ef.isEmpty else {
           return nil
        }
    
        self.init(
            prevo = ef[0]["evolved_species_id"] as! Int
        )
    }
    

    【讨论】:

    • 所以我通读了所有的答案,他们基本上说了同样的话。然而,我选择这个的原因是因为它无需将self.init 包装在if-let-statement 中即可达到预期的效果
    • if - let 更可取,因为您可以检查多个条件。
    【解决方案2】:

    尝试使用if let 而不仅仅是let。这样可以避免错误。

    【讨论】:

      【解决方案3】:

      您可以使用if let 构造安全地展开并使用where 检查数组元素是否大于零。

      if let ef = dict["evolves-from"] as? [[String:Any]] where ef.count > 0 {
      let ef1 = ef[0]["evolved_species_id"]
      self.init(
          prevo: ef1 as? Int ?? 0,
       )
      } else {
       self.init(
          prevo: 0 
      )
      }
      

      如果您使用的是 Swift 3.0

      if let ef = dict["evolves-from"] as? [[String:Any]], ef.count > 0 {
       let ef1 = ef[0]["evolved_species_id"]
        self.init(
          prevo: ef1 as? Int ?? 0,
         )
       } else {
         self.init(
          prevo: 0 
         )
       }
      

      【讨论】:

        【解决方案4】:

        你可以这样做

        convenience init(fromDict dict: [String:Any]) {
            let ef = dict["evolves-from"] as? [[String:Any]]
            if !(ef.isEmpty){ /// OR if (ef.count > 0) 
                let ef1 = ef?[0]["evolved_species_id"]
            self.init(
                prevo: ef1 as? Int ?? 0,
            )
          }
         }
        

        【讨论】:

          【解决方案5】:

          在对数组进行索引之前,应始终检查数组是否包含任何内容,这将避免索引超出范围的异常。由于您正在尝试获取第 0 个索引元素,因此您可以使用数组的 first 属性重新编写代码:

          init(fromDict dict: [String:Any])
          {
              let ef = dict["evolves-from"] as? [[String:Any]]
              let ef1 = ef?.first?["evolved_species_id"]
              self.init(prevo: ef1 as? Int ?? 0)
          }
          

          使用 firstlast 属性来安全访问 数组的第一个和最后一个元素。如果数组为空,这些 属性为零。

          Swift Array Reference

          【讨论】:

            猜你喜欢
            • 2021-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-27
            • 2015-07-01
            • 1970-01-01
            相关资源
            最近更新 更多