2017-03-03 46 views
0

我试图解析字典中的数据。我有代码,目前的作品,但我认为有一个更好的更简洁的方法来做到这一点。可选绑定,然后在swift中转换为可选

我有什么我的字典可以等于

let dictionary:[String:Any] = ["pic":"picture"] //opt1 
let dictionary:[String:Any] = ["pic":2]   //opt2 
let dictionary:[String:Any] = ["pi":"this"]  //opt3 

这是我目前使用的解析,我想还有待提高数据的代码三个选项。

let _pic = dictionary["pic"] 
if _pic != nil && !(_pic is String) { 
    print("error") 
    return 
} 
let pic = _pic as? String 

对于每个选项,我想不同的事情发生了:

OPT1

pic:String? = Optional(picture) 

OPT2要显示的错误

OPT3

pic:String? = nil 

回答

0

你可以试试这个,

guard let _pic = dictionary["pic"] as? String else { return } 
+0

欢呼的答案,我这样做的问题是在我的opt3。这里的东西是我不想在字典中没有正确的键时出现错误。 –

+0

然后你也可以使用if ... else。 –

+0

我已经在代码中做到了这一点。我正在寻找一个改进的更简洁的版本(因为我必须重复这些代码来处理我从字典中解析出来的所有内容)。但是如果不可能做一个更简洁的版本,我会保持它与我有。 –

0
let _pic = dictionary["pic"] 

这在默认情况下为您提供_picAny?类型的可选值。因此,你的代码似乎可以根据你的要求,我认为你不需要最后一行let pic = _pic as? String

+0

我认为最后一个选项可能会崩溃。 –

+0

除非他现在想要使用该值,在这种情况下,他会先检查该值是否为“!= nil”,然后再输入“as!”。字符串' –

+0

是的,我可能没有说清楚我的目标是然后使用该变量,然后变量将必须是一个字符串?我将编辑问题以表明这一点。 –

0

我认为你需要做两个测试。这里有一种方法:

guard let picAsAny = dictionary["pic"] 
else { /* No key in the dictionary */ } 
guard let pic = picAsAny as? String 
else { /* error wrong type */ } 

// pic is now a (nonoptional) string 

很明显,您可以使用if语句而不是取决于上下文的警卫。

相关问题