ฉันต้องตรวจสอบว่า dict มีรหัสหรือไม่ อย่างไร?
NSDictionary
มีคีย์ใด ๆ (ไม่เฉพาะเจาะจง) คุณควรใช้[dictionary allKeys].count == 0
ถ้าcount
เป็นมีคีย์ในไม่มี0
NSDictionary
ฉันต้องตรวจสอบว่า dict มีรหัสหรือไม่ อย่างไร?
NSDictionary
มีคีย์ใด ๆ (ไม่เฉพาะเจาะจง) คุณควรใช้[dictionary allKeys].count == 0
ถ้าcount
เป็นมีคีย์ในไม่มี0
NSDictionary
คำตอบ:
objectForKey
จะคืนค่าศูนย์ถ้าไม่มีคีย์
[NSNull null]
แทน
if ([[dictionary allKeys] containsObject:key]) {
// contains key
}
หรือ
if ([dictionary objectForKey:key]) {
// contains object
}
เวอร์ชันล่าสุดของ Objective-C และ Clang มีรูปแบบที่ทันสมัยสำหรับเรื่องนี้:
if (myDictionary[myKey]) {
}
คุณไม่จำเป็นต้องตรวจสอบความเท่าเทียมกันกับศูนย์เนื่องจากมีเพียงวัตถุที่ไม่ใช่ศูนย์วัตถุประสงค์เท่านั้นที่สามารถเก็บไว้ในพจนานุกรม (หรืออาร์เรย์) และวัตถุ Objective-C ทั้งหมดเป็นค่าความจริง แม้@NO
, @0
และ[NSNull null]
ประเมินผลการศึกษาเป็นความจริง
แก้ไข: Swift ตอนนี้เป็นเรื่อง
สำหรับ Swift คุณจะลองทำสิ่งต่อไปนี้
if let value = myDictionary[myKey] {
}
ไวยากรณ์นี้จะดำเนินการถ้าบล็อกถ้า myKey อยู่ใน dict และถ้าเป็นเช่นนั้นค่าจะถูกเก็บไว้ในตัวแปรค่า โปรดทราบว่าสิ่งนี้ใช้ได้กับค่าที่ผิดพลาดเช่น 0
if ([mydict objectForKey:@"mykey"]) {
// key exists.
}
else
{
// ...
}
เมื่อใช้พจนานุกรม JSON:
#define isNull(value) value == nil || [value isKindOfClass:[NSNull class]]
if( isNull( dict[@"my_key"] ) )
{
// do stuff
}
ฉันชอบคำตอบของเฟอร์นันเดสแม้ว่าคุณจะขอให้มีการ obj สองครั้ง
สิ่งนี้ควรทำ (มากกว่าหรือน้อยกว่าเช่นเดียวกับ Martin's A)
id obj;
if ((obj=[dict objectForKey:@"blah"])) {
// use obj
} else {
// Do something else like creating the obj and add the kv pair to the dict
}
Martin และคำตอบนี้ใช้ได้กับ iPad2 iOS 5.0.1 9A405
gotcha ที่น่ารังเกียจอย่างหนึ่งซึ่งเพิ่งเสียเวลาเล็กน้อยในการดีบัก - คุณอาจพบว่าตัวเองได้รับแจ้งจากการป้อนอัตโนมัติเพื่อลองใช้ doesContain
ซึ่งดูเหมือนว่าจะใช้งานได้
ยกเว้นdoesContain
ใช้การเปรียบเทียบรหัสแทนการเปรียบเทียบกัญชาที่ใช้โดยดังนั้นหากคุณมีพจนานุกรมด้วยปุ่มสตริงมันจะไม่กลับไปobjectForKey
doesContain
NSMutableDictionary* keysByName = [[NSMutableDictionary alloc] init];
keysByName[@"fred"] = @1;
NSString* test = @"fred";
if ([keysByName objectForKey:test] != nil)
NSLog(@"\nit works for key lookups"); // OK
else
NSLog(@"\nsod it");
if (keysByName[test] != nil)
NSLog(@"\nit works for key lookups using indexed syntax"); // OK
else
NSLog(@"\nsod it");
if ([keysByName doesContain:@"fred"])
NSLog(@"\n doesContain works literally");
else
NSLog(@"\nsod it"); // this one fails because of id comparison used by doesContain
การใช้ Swift จะเป็น:
if myDic[KEY] != nil {
// key exists
}
ใช่. ข้อผิดพลาดประเภทนี้เกิดขึ้นบ่อยมากและทำให้แอปขัดข้อง ดังนั้นฉันใช้เพื่อเพิ่ม 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"];
สำหรับการตรวจสอบการมีอยู่ของคีย์ใน NSDictionary:
if([dictionary objectForKey:@"Replace your key here"] != nil)
NSLog(@"Key Exists");
else
NSLog(@"Key not Exists");
เนื่องจากไม่มีศูนย์ไม่สามารถจัดเก็บในโครงสร้างข้อมูลของมูลนิธิได้ในNSNull
บางครั้งเพื่อเป็นตัวแทนnil
ของ เนื่องจากNSNull
เป็นวัตถุซิงเกิลคุณสามารถตรวจสอบว่าNSNull
เป็นค่าที่จัดเก็บในพจนานุกรมหรือไม่โดยใช้การเปรียบเทียบตัวชี้โดยตรง:
if ((NSNull *)[user objectForKey:@"myKey"] == [NSNull null]) { }
NSNull
@"myKey"
นั่นเป็นสิ่งที่แตกต่างไปอย่างสิ้นเชิงกับกุญแจที่@"myKey"
ไม่ได้อยู่ในพจนานุกรม
วิธีแก้ปัญหาสำหรับ 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
}
ฉันขอแนะนำให้คุณเก็บผลการค้นหาในตัวแปร temp ทดสอบว่าตัวแปร temp เป็นศูนย์หรือไม่จากนั้นใช้ ด้วยวิธีนี้คุณจะไม่มองวัตถุเดียวกันสองครั้ง:
id obj = [dict objectForKey:@"blah"];
if (obj) {
// use obj
} else {
// Do something else
}
ดังที่ Adirael แนะนำobjectForKey
ให้ตรวจสอบการมีอยู่ของคีย์ แต่เมื่อคุณโทรobjectForKey
ในพจนานุกรมที่ไม่มีค่าใช้จ่ายแอปจะขัดข้องดังนั้นฉันจึงแก้ไขจากวิธีต่อไปนี้
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}
if ([MyDictionary objectForKey:MyKey]) {
// "Key Exist"
}