即使在打开它之后也可以选择值

时间:2016-08-05 06:38:50

标签: ios json swift dictionary optional

我有一个JSON对象,其中包含一些字典和数组,如下所示

let stats = screendata["stats"]! as? NSDictionary

现在,当我尝试从中获取字典时,它会为我提供一个可选字典,以便如何删除这个可选字词?

print(stats!["reward_listing"]! as? NSDictionary)

这是我得到的输出

Optional({
"btn_label" = "905 points to go";
description = "Free any size drink at Starbucks";
id = 1;
price = "1000 Points";
status = disable;
title = "Free any size drink at Starbucks";
})

请指导我如何删除此可选字词?

4 个答案:

答案 0 :(得分:3)

您使用强制解包screendata["stats"]是正确的,但是然后使用as?运算符强制转换为NSDictionaryas?返回一个可选项,如果转换失败则返回nil。您可以将两个步骤合并为一行:

let stats = screendata["stats"] as! NSDictionary

这将转换为NSDictionary 强制解包。话虽如此,您应该将!视为“请立即崩溃”运算符,并使用更安全的if let代替:

if let stats = screendata["stats"] as? NSDictionary {
    print(stats)
} else {
    //either `screendata` had no entry for "stats" or it wasn't an `NSDictionary`
    print("Couldn't unwrap.")
}

答案 1 :(得分:1)

如果您确定它始终是NSDictionary,则可以使用as!代替as? 这可以解决问题。 但更好的方法是使用if-let语句打开它:

if let listing = stats!["reward_listing"] as? NSDictionary {
    print(listing) 
} else {
    print("Failed to unwrap")
}

通常你应该摆脱惊叹号,因为它们经常会导致运行时出错。 使用if-let重写你的第一个语句。

答案 2 :(得分:0)

试试这个 -

guard let stats = screendata["stats"] as? NSDictionary 
  else 
  {
   // Value requirements not met, do something
  return
  }

  // Do stuff with stats

答案 3 :(得分:-2)

StandardScaler

用这个替换它将删除可选。 !代表必需,这意味着总会有一些值。