我需要检查字典是否有钥匙。如何?
当前回答
因为nil不能存储在Foundation数据结构中,NSNull有时表示nil。因为NSNull是一个单例对象,你可以通过直接指针比较来检查NSNull是否是存储在字典中的值:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
其他回答
我建议您将查找结果存储在一个临时变量中,测试临时变量是否为nil,然后使用它。这样你就不会重复查找同一个对象:
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
是的。这类错误非常常见,会导致应用程序崩溃。所以我使用添加NSDictionary在每个项目如下:
//.h文件代码:
@interface NSDictionary (AppDictionary)
- (id)objectForKeyNotNull : (id)key;
@end
/ /。M文件代码如下
#import "NSDictionary+WKDictionary.h"
@implementation NSDictionary (WKDictionary)
- (id)objectForKeyNotNull:(id)key {
id object = [self objectForKey:key];
if (object == [NSNull null])
return nil;
return object;
}
@end
在代码中,您可以使用如下:
NSStrting *testString = [dict objectForKeyNotNull:@"blah"];
使用Swift,它将是:
if myDic[KEY] != nil {
// key exists
}
如果键不存在,objectForKey将返回nil。
swift 4.2解决方案
所以,如果你只想回答这个问题,字典是否包含键,问:
let keyExists = dict[key] != nil
如果你想要这个值,并且你知道字典中包含这个键,那么说:
let val = dict[key]!
但如果,就像通常发生的那样,你不知道它包含键-你想获取它并使用它,但前提是它存在-然后使用类似if let的东西:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
推荐文章
- 在实现API时,我如何避免在块中捕获自我?
- 从另一个应用程序打开设置应用程序
- 使用NSURLSession发送POST请求
- 如何更改导航栏上“后退”按钮的标题
- 有没有办法从UITableView中移除分隔线?
- 如何在Objective-C中声明类级属性?
- 在Objective-C中@property保留,赋值,复制,非原子
- 我如何在NSAttributedString中创建一个可点击的链接?
- 停止UIWebView垂直“弹跳”?
- 对未渲染的视图进行快照,结果是一个空快照
- 开始使用instancetype而不是id是否有益?
- 我可以强制UITableView隐藏分隔符之间的空单元格吗?
- 为什么Objective-C文件使用。m扩展名?
- Objective-C for Windows
- 获得推送通知,而应用程序在前台iOS