swift2中的分段错误11

时间:2016-07-30 08:56:12

标签: ios swift xcode

我不知道为什么会收到此错误。

问题代码在这里

for i in 0..<itemDataJson?.count {
        imageUrls.append(appDelegate.itemDataJson![i]["image_url"].string!)
}

当我print(itemDataJson?.count)时,它会打印Optional(1)。 我做错了什么?

谢谢。

4 个答案:

答案 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