使用 NSDictionary 和 valueForKey 快速澄清可选

Posted

技术标签:

【中文标题】使用 NSDictionary 和 valueForKey 快速澄清可选【英文标题】:Swift clarification about optional with NSDictionary and valueForKey 【发布时间】:2015-03-16 18:59:35 【问题描述】:

我正在尝试学习 Swift 移植管理 HttpRequest 的 Obj-C 代码,但是当我收到 JSON 格式的响应时,我在尝试访问 NSDictionary 时遇到了问题。

JSON 示例:


    response =     
        id = 1234;
        name = a2b3n4h5lkl3;
    ;

我从 HttpRequest completionHandler 收到

(dictionary:NSDictionary?, error:NSError?) -> Void

我想从 NSDictionary 中获取一些值吗?并将它们保存到 var:

let responseDictionary = dictionary!.valueForKey("response") as? NSDictionary

println(responseDictionary!)                        // The informations are present correctly

if (responseDictionary!.count > 0) 

    var testStringAccessId:NSString? = responseDictionary!.valueForKey("id")! as? NSString

    println(testStringAccessId)                     // print nil

    println(responseDictionary!.valueForKey("id")!) // print the correct value

    if let stringAccessId = responseDictionary!.valueForKey("id")! as? NSString 
        self.accessID = stringAccessId
     else 
        println("Error No Access ID")               // Enter here
        completion(success: false)
        return                                      // The function exit with error
    

我尝试了很多组合,但也许我在可选使用中遗漏了一些东西。奇怪的是,如果我在错误情况下评论返回并尝试从 NSDictionary 获取另一个值,那么这个值是正确的,例如:

if let stringAccessNAME = responseDictionary!.valueForKey("name")! as? NSString 
    self.accessNAME = stringAccessNAME              // I get the correct value saved in the variable
 else 
    println("Error No Access NAME")
    completion(success: false)
    return

有什么帮助吗?

谢谢 麦芽酒

已解决

使用 NSNumber 代替 NSString。感谢 Jesper

【问题讨论】:

听起来您没有正确定位 JSON 中的 id 值。一些示例 JSON 将有助于显示问题。 使用 JSON 示例编辑 id 的值似乎不是字符串而是数字。尝试NSNumber 而不是NSString - 而不是像我一样猜测(因为我必须这样做,所以我无权访问正在运行的代码),检查调试器中的值和类型。 感谢 Jesper,你说的完全正确,我改成 NSNumber 并且工作正常。 【参考方案1】:

正如您在编辑后的问题中正确说明的那样,您的 ID 不会存储为字符串(或 NSString),尝试将字符串转换为 NSNumber 将返回 nil 值。

var testStringAccessId:NSNumber? = responseDictionary!.valueForKey("id")! as? NSNumber

这是在这里使用的正确语法。

我可能想补充一点,您在检查字典之前将其解包。你可能想在那里添加一个检查,如果你无法连接到互联网,或者当你的 API 崩溃时会发生什么?很少有时候你真的必须使用!

【讨论】:

以上是关于使用 NSDictionary 和 valueForKey 快速澄清可选的主要内容,如果未能解决你的问题,请参考以下文章

字典NSDictionary和NSMutableDictionary的使用

使用 NSDictionary 和 valueForKey 快速澄清可选

iOS 使用 NSDictionary 将数据加载到部分和行中

NSDictionary 和 NSMutableDictionary 组合

更新使用 ng-options 生成的选择的模型和选定选项

使用 FMDB 和 NSDictionary 向 SQLite 数据库添加 NULL 值