在编码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
声明,但我认为这不会是聪明的,甚至不可能。
答案 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.
}