检测NSDictionary中的Null值

 沝伊 发布于 2023-01-11 18:56

我有一个NSDictionary来自API服务器的JSON响应.有时候这个字典中的键的值是Null

我试图获取给定的值并将其放入表格单元格的详细文本中以供显示.

问题在于,当我试图将值强制转换NSString为崩溃时,我认为这是因为我试图强制Null转换为字符串.

这样做的正确方法是什么?

我想做的是这样的:

cell.detailTextLabel.text = sensor.objectForKey( "latestValue" ) as NSString

这是一个字典的例子:

Printing description of sensor:
{
    "created_at" = "2012-10-10T22:19:50.501-07:00";
    desc = "";
    id = 2;
    "latest_value" = "";
    name = "AC Vent Temp";
    "sensor_type" = temp;
    slug = "ac-vent-temp";
    "updated_at" = "2013-11-17T15:34:27.495-07:00";
}

如果我只需要在条件中包装所有这些,那很好.我只是无法弄清楚条件是什么.回到Objective-C世界,我会比较,[NSNull null]但这似乎不适用于Swift.

5 个回答
  • 您还可以使用is检查是否存在null:

    if sensor["latestValue"] is NSNull {
        // do something with null JSON value here
    }
    

    2023-01-11 18:58 回答
  • NSNull是一个像任何其他类一样的类.因此,您可以使用isas测试AnyObject引用.

    因此,在我的一个应用程序中,我有一个NSArray,其中每个条目都是Card或NSNull(因为你不能把nil放在NSArray中).我将NSArray作为一个数组取出并循环通过它,切换我得到的对象类型:

    for card:AnyObject in arr {
        switch card { // how to test for different possible types
        case let card as NSNull:
            // do one thing
        case let card as Card:
            // do a different thing
        default:
            fatalError("unexpected object in card array") // should never happen!
        }
    }
    

    这与您的场景不同,但它来自一个转换为Swift的工作应用程序,并说明了完整的通用技术.

    2023-01-11 18:58 回答
  • 您可以使用as?运算符,它返回一个可选值(nil如果向下转换失败)

    if let latestValue = sensor["latestValue"] as? String {
        cell.detailTextLabel.text = latestValue
    }
    

    我在一个快速的应用程序中测试了这个例子

    let x: AnyObject = NSNull()
    if let y = x as? String {
        println("I should never be printed: \(y)")
    } else {
        println("Yay")
    }
    

    它正确打印"Yay",而

    let x: AnyObject = "hello!"
    if let y = x as? String {
        println(y)
    } else {
        println("I should never be printed")
    }
    

    "hello!"按预期打印.

    2023-01-11 18:58 回答
  • 我现在的解决方案:

    func isNull(someObject: AnyObject?) -> Bool {
        guard let someObject = someObject else {
            return true
        }
    
        return (someObject is NSNull)
    }
    

    到目前为止测试看起来不错

    到目前为止测试看起来很好

    2023-01-11 18:58 回答
  • 我正在使用这些组合.另外,该组合检查对象是否不是"null".

    func isNotNull(object:AnyObject?) -> Bool {
        guard let object = object else {
            return false
        }
        return (isNotNSNull(object) && isNotStringNull(object))
    }
    
    func isNotNSNull(object:AnyObject) -> Bool {
        return object.classForCoder != NSNull.classForCoder()
    }
    
    func isNotStringNull(object:AnyObject) -> Bool {
        if let object = object as? String where object.uppercaseString == "NULL" {
            return false
        }
        return true
    }
    

    它不是那么漂亮,但作为魅力工作:)

    2023-01-11 18:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有