我不知道为什么会收到此错误。
问题代码在这里
for i in 0..<itemDataJson?.count {
imageUrls.append(appDelegate.itemDataJson![i]["image_url"].string!)
}
当我print(itemDataJson?.count)
时,它会打印Optional(1)。
我做错了什么?
谢谢。
答案 0 :(得分:1)
它打印Optional(1)因为变量itemDataJson是可空的,所以计数因此必须是可空的,因为我们不知道itemDataJson是否实际上有值。
我在代码中看到的主要问题是你是强制解包变量。强制展开变量是代码气味(通常,虽然我不时自己做,但你需要小心)。
当您强行打开变量时,您需要问自己一个问题,“如果此变量为零,我是否希望应用程序崩溃?”。如果答案是肯定的,那么使用强制解包是可以接受的,否则,你应该创建一个不可为空的变量,或者如果不可能,你应该在swift中使用guard语句。
这可以这样使用:
guard let itemDataJson = itemDataJson else {
// itemDataJson was null do something
return
}
您也可以使用if let
构造,但如果不正确使用if let
构造,请注意厄运的金字塔。请参阅here以正确使用它,或使用保护声明。
如果您还没有这样做,我建议您查看optionals上的文档。
答案 1 :(得分:0)
我会将代码更改为此版本:
if (itemDataJson != nil) {
for i in 0..<itemDataJson!.count {
imageUrls.append(appDelegate.itemDataJson![i]["image_url"].string!)
}
}
答案 2 :(得分:0)
在尝试访问基础值之前,应检查所有选项。最好的做法是使用if let
语句。
if let itemDataJSON = itemDataJSON {
for i in 0..<itemDataJSON.count {
if let items = appDelegate.itemDataJSON {
if let imageURL = items[i]["imageURL"].string {
imageUrls.append(imageURL)
}
}
}
}
除此之外,在AppDelegate
中存储数据是一种不好的做法。您应该创建自己的数据层,而不依赖于AppDelegate
,以使数据处理更加高效和轻松。
答案 3 :(得分:-2)
而不是检查nil,你应该试试这个。
pos_list