Ios 在Swift中跳过空数组?

Ios 在Swift中跳过空数组?,ios,arrays,swift,indexing,Ios,Arrays,Swift,Indexing,对不起,我不太清楚这个问题怎么表达。所以我很清楚问题是什么。我正在读几本书。一些plist没有存储在“进化的物种”id中的数组,这就产生了错误 索引超出范围 如何让我的代码跳过没有存储数组的“进化的物种”实例?这是我用来获取数据的代码 convenience init(fromDict dict: [String:Any]) { let ef = dict["evolves-from"] as? [[String:Any]] let ef1 = ef?[0]["evolved_s

对不起,我不太清楚这个问题怎么表达。所以我很清楚问题是什么。我正在读几本书。一些plist没有存储在“进化的物种”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”]
处创建的,如果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 
   )
 }

如果让
而不是只让使用,请尝试使用
。这可以避免错误。

您可以检查数组是否存在并且不是空的

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

在为数组编制索引之前,应该始终检查数组是否包含任何内容,这样可以避免索引越界异常。由于您试图获取第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)
}
使用第一个和最后一个属性安全访问 数组的第一个和最后一个元素。如果数组为空,则 属性为零


你可以这样做

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

所以我通读了所有的答案,他们说的基本上是一样的。然而,我之所以选择这一条,是因为它在不包装
if-let语句的情况下实现了所需的结果。init
if-let语句中更可取,因为您可以检查多个条件。