Swift数组遍历异常:无法进入循环并提取元素至变量
数组元素提取到独立变量的问题解决方案
嘿,我来帮你搞定这个问题!首先你的循环没执行,几乎可以肯定是因为myarray是空数组——要么UserDefaults里根本没有selectArray这个key,要么对应的存储值就是空的,所以你用?? [String]()兜底后得到的是空数组,自然不会进入循环啦。
既然你明确数组里有两个元素,完全没必要用遍历的方式来赋值,直接通过索引访问或者解构赋值更简单高效,下面给你两种靠谱的写法:
方案一:索引直接取值(适用于确定数组有至少2个元素的场景)
如果能保证myarray一定包含两个元素,直接这么写就行,记得加个长度判断避免越界崩溃:
let myarray = UserDefaults.standard.stringArray(forKey: "selectArray") ?? [String]() if myarray.count >= 2 { let listItem = myarray[0] let cuisineItem = myarray[1] print("listItem: \(listItem), cuisineItem: \(cuisineItem)") } else { // 这里处理数组元素不够的情况,比如给默认值或者提示用户 print("数组元素不足2个,请检查UserDefaults的存储内容!") }
方案二:Swift解构赋值(更简洁,兼容元素不足的情况)
Swift 5.1及以上支持数组的解构赋值,这种写法更清爽,还能给默认值防止数组元素不够:
let myarray = UserDefaults.standard.stringArray(forKey: "selectArray") ?? [String]() // 解构时给默认值,就算数组元素不足也不会出问题 let (listItem, cuisineItem) = ( myarray.first ?? "默认列表项", myarray.dropFirst().first ?? "默认美食项" ) print("listItem: \(listItem), cuisineItem: \(cuisineItem)")
另外,你可以先排查下UserDefaults里的存储是否正确,比如在代码开头加一行打印:
print("UserDefaults中selectArray的内容:\(UserDefaults.standard.stringArray(forKey: "selectArray"))")
如果输出是nil或者[],那就要检查你之前把数组存入UserDefaults的代码是不是没正确执行哦。
内容的提问来源于stack exchange,提问作者raheem
相关产品推荐
相关产品推荐

