我有来自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
答案 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
:
如果userInfo
为nil
,userInfo?["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" )
}
}