NSDictionary类型的非可选表达式,用于检查选项。错误

时间:2017-06-14 07:56:46

标签: ios swift

我正在尝试加载.plist文件时收到此警报。任何建议。 `

filePath = Bundle.main.path(forResource: Constants.kCPECardHeaderAttribute, ofType: "plist")

使用NSDictionary加载文件内容,如下所示:

guard let fileContentArray:NSDictionary = NSDictionary(contentsOfFile: filePath!)! else{
            return
        }

我收到此错误。有什么帮助吗?enter image description here `

3 个答案:

答案 0 :(得分:6)

!

之后删除NSDictionary(contentsOfFile:)
guard let fileContentArray = NSDictionary(contentsOfFile: filePath!) else {
    return
}

guard-let-else!都删除了选项。没有必要将它们用于相同的选项。

您实际上可以对两个选项使用相同的模式:

guard
    let filePath = filePath,
    let fileContentArray = NSDictionary(contentsOfFile: filePath)
else {
    return
}

作为旁注,将词典类型的变量命名为 arrays 并不常见。

答案 1 :(得分:1)

首先:变量名 fileContent 数组 ,预期类型 ...词典 令人困惑和矛盾。

你必须传递一个可选项才能使用可选绑定,感叹号会打开可选项,这会使检查变得毫无意义。删除第二个!

然而,强烈建议使用与URL相关的API和PropertyListSerialiation来获取本机Swift集合类型:

if let url = Bundle.main.url(forResource:Constants.kCPECardHeaderAttribute, withExtension: "plist") {
    do {
        let data = try Data(contentsOf: url)
        let fileContentDictionary = try PropertyListSerialization.propertyList(from: data, format: nil) as! [String:Any]
        print(fileContentDictionary)

    } catch {
        fatalError("Bad Design! This should never happen").
    }

}

答案 2 :(得分:-1)

这是因为你正在使用'!',如果你想检查它是否是可选的,你应该使用?相反,给它一个你想要的类型。

例如

guard let fileContentArray:NSDictionary = NSDictionary(contentsOfFile: filePath) ? String else{
        return
    }