从if语句全局

时间:2016-11-10 19:48:30

标签: swift if-statement optional optional-binding

在编码JSON时,我使用if let语句展开内容,但我想让全局变量

do {
  if
    let json = try JSONSerialization.jsonObject(with: data) as? [String: String], 
    let jsonIsExistant = json["isExistant"] 
  {
    // Here I would like to make jsonIsExistant globally available
  }

这甚至可能吗?如果不是,我可以在这个内部发表if声明,但我认为这不会是聪明的,甚至不可能。

2 个答案:

答案 0 :(得分:1)

在您想要的地方进行jsonIsExistant。如果您正在创建iOS应用程序,请创建变量<{p}以上viewDidLoad()

var jsonIsExistant: String?

然后在这一点上使用它

do {
    if let json = try JSONSerialization.jsonObject(with: data) as? [String: String], 
    let tempJsonIsExistant = json["isExistant"] {
        jsonIsExistant = tempJsonIsExistant
    }
}

这可以像这样重写

do {
    if let json = try JSONSerialization.jsonObject(with: data) as? [String: String] { 
        jsonIsExistant = json["isExistant"]
    }
} catch {
    //handle error
}

如果以第二种方式处理,那么你必须在使用之前检查jsonIsExistant是否为零,或者你可以立即用一个!来解开它!如果你确定它每次成功成为json时都会有一个“isExistant”字段。

答案 1 :(得分:1)

将变量公开到if let语句的外部是没有意义的:


if let json = ... {
    //This code will only run if json is non-nil.
    //That means json is guaranteed to be non-nil here.
}
//This code will run whether or not json is nil.
//There is not a guarantee json is non-nil.

您还有其他一些选择,具体取决于您要执行的操作:

您可以将需要json的其余代码放在if中。你说过你不知道嵌套的if语句是否聪明甚至可能。&#34;它们是可能的,程序员经常使用它们。您还可以将其提取到另一个函数中:

func doStuff(json: String) {
    //do stuff with json
}

//...
if let json = ... {
    doStuff(json: json)
}

如果您知道 JSON不应该是nil,您可以使用!强制解包:

let json = ...!

您可以使用guard语句使变量成为全局变量。仅当guard json时才会运行nil内的代码。 guard语句的正文必须退出封闭范围,例如通过抛出错误,从函数返回或带有标记的中断:

//throw an error
do {
    guard let json = ... else {
        throw SomeError
    }
    //do stuff with json -- it's guaranteed to be non-nil here.
}



//return from the function 
guard let json = ... else {
    return
}
//do stuff with json -- it's guaranteed to be non-nil here.



//labeled break
doStuff: do {
    guard let json = ... else {
        break doStuff
    }
    //do stuff with json -- it's guaranteed to be non-nil here.
}