代码之家  ›  专栏  ›  技术社区  ›  Steve

NSDictionary stringForKey:并将[NSNull]强制转换为NSString*

  •  6
  • Steve  · 技术社区  · 14 年前

    最近有人告诉我 [NSNull null] (NSString*) 是“可怕的”。

    然而, -[NSDictionary stringForKey:] 方法将返回 [NSNull空] 如果键不在字典里,如果我不做转换,编译器就会对我大喊大叫。

    编辑:

    每个人都指出,在NSDictionary上没有stringForKey:method,是的,当我问这个问题时,我正在考虑用户的默认值。。。所以我回去看看我在做什么。。。在这里:

    NSString * someValue = (NSString*)[myDictionary objectForKey:@"key"];
    if (someValue == (NSString*)[NSNull null]) ...
    

    warning: comparison of distinct Objective-C types 'struct NSNull *' and 'struct NSString *' lacks a cast

    铸造的价值“解决”的问题,我宁愿不写10行,其中一个将做。。。

    也:

    字典来自JSON库。。。在本例中,null是有效值,因此可能不是NSDictionary在缺少键时返回它们,而是键实际上在那里,并且值实际上是null。

    5 回复  |  直到 14 年前
        1
  •  14
  •   Jonathan Grynspan    14 年前

    NSDictionary 不返回的实例 NSNull 除非你或其他人把它们放在那里。也, 字典 -stringForKey: . 你是不是在想 NSUserDefaults ?

    字典

    NSString *MyGetString(NSDictionary *dict, id key, NSString *fallback) {
        id result = [dict objectForKey: key];
    
        if (!result)
            result = fallback;
        else if (![result isKindOfClass: [NSString class]])
            result = [result description];
    
        return result;
    }
    

    将回退字符串作为 fallback key .

        2
  •  7
  •   mohsenr    14 年前

    isKindOfClass: 方法。它将保护你,即使你改变你的方法检索对象等,是一个更准确的检查。

    还记得吗 [someValue isKindOfClass:[NSString class]] YES 只有当 someValue 不是 nil 这是一个 NSString 也就是说这也足够测试了 价值观。

        3
  •  6
  •   walkytalky    14 年前

    演员阵容不好是因为 NSNull 不是 NSString . 强制转换不会改变所指向对象的实际类型,它只会改变编译器的, 去吧。

    在所示的非常特殊的情况下 只有

    当然,真正的问题是 以前的 演员,演员在哪里 NSObject* objectForKey: NSString* 毫无疑问。目前,你可以侥幸逃脱,因为你认为你保证只得到字符串或 NSNull

    NSObject* someValue = [myDictionary objectForKey:@"key"];
    NSString* someStr = nil;
    if (someValue == [NSNull null])
       ...
    else if ([someValue isKindOfClass:[NSString class]])
       someStr = (NSString*) someValue;
    ....
    
        4
  •  3
  •   Stonz2    8 年前

    NSDictionary+Verified.h

    //  NSDictionary+Verified.h
    //
    //  Created by alexruperez on 08/05/13.
    //  Copyright (c) 2013 alexruperez. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface NSDictionary (Verified)
    
    - (id)verifiedObjectForKey:(id)aKey;
    
    @end
    

    NSDictionary+Verified.m

    NSDictionary+Verified.m
    
    #import "NSDictionary+Verified.h"
    
    @implementation NSDictionary (Verified)
    
    - (id)verifiedObjectForKey:(id)aKey
    {
        if ([self objectForKey:aKey] && ![[self objectForKey:aKey] isKindOfClass:[NSNull class]]) return [self objectForKey:aKey];
        return nil;
    }
    
    @end
    
        5
  •  1
  •   ohhorob    14 年前

    一个很好的空检查测试,特别是测试来自网络api(特别是JSON)的解析结果时 isEqual:

    NSString *someValue = [response objectForKey:MyAPIKeySomeValue];
    if (!!someValue && ![someValue isEqual:[NSNull null]]) {
        // optionally test for class type
        // use someValue
    }
    else {
        // error out for required values; skip for optional values
    }
    

    @try/@catch . 然后可以处理异常/非法响应格式,并消除无效数据格式的硬崩溃。

    NSError .