从userInfo Dictionary获取字符串

时间:2014-10-13 01:13:16

标签: dictionary swift optional

我有来自UILocalNotification的userInfo字典。使用隐式展开时是否有一种简单的方法来获取String值?

if let s = userInfo?["ID"]

给我一​​个AnyObject,我必须转换为字符串。

if let s = userInfo?["ID"] as String 

给我一​​个关于StringLiteralConvertable的错误

只是不想声明两个变量来获取一个字符串 - 一个用于解包的文字和另一个用于转换字符串的var。

修改

这是我的方法。这也不起作用 - 我得到(NSObject,AnyObject)在if语句中不能转换为String。

  for notification in scheduledNotifications
  {
    // optional chainging 
    let userInfo = notification.userInfo

    if let id = userInfo?[ "ID" ] as? String
    {
      println( "Id found: " + id )
    }
    else
    {
      println( "ID not found" )
    }
  }

在我的问题中我没有这个,但除了这种方式工作之外,我还想实际拥有

if let s = notification.userInfo?["ID"] as String 

1 个答案:

答案 0 :(得分:19)

您想使用as?

来使用条件

(注意:这适用于Xcode 6.1。对于Xcode 6.0,见下文)

if let s = userInfo?["ID"] as? String {
    // When we get here, we know "ID" is a valid key
    // and that the value is a String.
}

此构造安全地从userInfo

中提取字符串
  • 如果userInfoniluserInfo?["ID"]会因可选链接条件广播nil 返回类型为String?的变量,其值为nil可选绑定然后失败,并且未输入该块。

  • 如果"ID"不是字典中的有效密钥,则userInfo?["ID"]会返回nil,并且会像前一种情况一样继续。

  • 如果该值是其他类型(例如Int),那么条件转换 as?将返回nil,它会像上面那样继续例。

  • 最后,如果userInfo不是nil"ID"是字典中的有效密钥,且值的类型为String,然后条件转换返回包含字符串的可选字符串String?可选绑定 if let然后解包String并将其分配给s,其类型为String


对于Xcode 6.0,您还必须做一件事。您需要有条件地转换为NSString而不是String,因为NSString是对象类型而String不是。{1}}。他们显然改进了Xcode 6.1中的处理,但对于Xcode 6.0,请执行以下操作:

if let s:String = userInfo?["ID"] as? NSString {
    // When we get here, we know "ID" is a valid key
    // and that the value is a String.
}

最后,解决你的最后一点:

  for notification in scheduledNotifications
  {
      if let id:String = notification.userInfo?["ID"] as? NSString
      {
          println( "Id found: " + id )
      }
      else
      {
          println( "ID not found" )
      }
  }