跳过Swift中的空数组?

时间:2017-01-02 10:09:24

标签: ios arrays swift indexing

抱歉,我不太确定如何说出这个问题。所以我确切地知道问题是什么。我正在读几个plist。一些plist没有存储在“evolved_species_id”中的数组,这会产生错误

  

指数超出范围

如何让我的代码跳过没有存储数组的“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"]

创建了控制台错误

5 个答案:

答案 0 :(得分: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
    )
}

答案 1 :(得分:0)

您可以使用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 
   )
 }

答案 2 :(得分:0)

尝试使用if let而非let。这可以避免错误。

答案 3 :(得分:0)

在索引之前,您应该始终检查数组是否包含任何内容,它将避免索引超出绑定的异常。由于您尝试获取第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)
}
  

使用 first last 属性安全访问该值的值   数组的第一个和最后一个元素。如果数组为空,则为这些   属性是零。

Swift Array Reference

答案 4 :(得分:0)

你可以做这样的事情

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