在守卫声明之后还有其他人,但除此之外,为什么还在抱怨?

时间:2017-06-14 11:33:06

标签: swift

我正在尝试PropertyListSerialization而不是仅使用NSDictionary(contentsOfFile:),因此我更改了代码。现在使用guard,我必须提供else。我提供else。我在这行代码中犯了什么错误?

它说:

  

预期'否则'在'后卫'条件。

使用NSDictionary(contentsOfFile:)时这行代码运行正常。但是对PropertyListSerialization的这种改变对我不起作用。

        guard
            let filePathValue = filePath,
//            let fileContentDictionary:NSDictionary = NSDictionary(contentsOfFile: filePathValue)
        let data = try? Data(contentsOf: filePathValue as URL),

        let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String:Any]]
            print(result!)

        else{
            return
        }

enter image description here

3 个答案:

答案 0 :(得分:1)

您的print(result!)是个问题。

删除它。

<强>更新

guard let filePathValue = filePath,
      //let fileContentDictionary: NSDictionary = NSDictionary(contentsOfFile: filePathValue)
      let data = try? Data(contentsOf: filePathValue as URL),
      let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String:Any]]
else {
    return
}

print(result!)

答案 1 :(得分:1)

如果您的回复是result,那么您也可以在else阻止之后访问dictionary,然后您需要将propertyList(from:options:format:)的结果转换为[String:Any] [[String:Any]],因为它是字典。

guard let filePathValue = filePath,
    //let fileContentDictionary: NSDictionary = NSDictionary(contentsOfFile: filePathValue)
    let data = try? Data(contentsOf: filePathValue as URL),
    let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String:Any] //not [[String:Any]]
else {
    return
}
//Result is still optional
print(result!)

现在,您使用try?后,您的结果仍然是可选的,因此如果您希望结果为非可选结果,请将()try?一起使用。

guard let filePathValue = filePath,
    //let fileContentDictionary: NSDictionary = NSDictionary(contentsOfFile: filePathValue)
    let data = try? Data(contentsOf: filePathValue as URL),
    let result = (try? PropertyListSerialization.propertyList(from: data, options: [], format: nil)) as? [String:Any] //not [[String:Any]]
else {
    return
}
//Now result is non-optional
print(result)

答案 2 :(得分:1)

基本的guard-else块看起来像这样:

guard `condition` else {
    `statements`
}

示例:

guard let name = optionalName else {
    // Value requirements not met, do something.
    // name isn't available here
    return
}
// Value requirements met, do something with name
// name is available here
// Rest of the code goes here

您必须将guard-else视为单个程序控制语句。他们之间没有任何陈述。仅检查条件。您可以使用逗号(,)分隔多个条件。

来自documentation它说:

  

任何常量或变量都从可选绑定中赋值   保护声明条件中的声明可用于其余部分   守卫声明的封闭范围。