Ios 在Swift中跳过空数组?
对不起,我不太清楚这个问题怎么表达。所以我很清楚问题是什么。我正在读几本书。一些plist没有存储在“进化的物种”id中的数组,这就产生了错误 索引超出范围 如何让我的代码跳过没有存储数组的“进化的物种”实例?这是我用来获取数据的代码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
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语句中更可取,因为您可以检查多个条件。