抱歉,我不太确定如何说出这个问题。所以我确切地知道问题是什么。我正在读几个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"]
答案 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 属性安全访问该值的值 数组的第一个和最后一个元素。如果数组为空,则为这些 属性是零。
答案 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,
)
}
}