ฉันจะเพิ่มค่าบูลีนให้กับ NSDictionary ได้อย่างไร


112

NSNumberดีสำหรับจำนวนเต็มผมจะใช้ แต่ใช่และไม่ใช่ไม่ใช่สิ่งของฉันเดา Afaik ฉันสามารถเพิ่มวัตถุใน an ได้NSDictionaryเท่านั้นใช่ไหม?

ฉันไม่พบคลาส Wrapper สำหรับบูลีน มีผู้ใด?

คำตอบ:


156

คุณใช้ NSNumber

มันมีวิธีการ init ... และ number ... ที่ใช้บูลีนเช่นเดียวกับจำนวนเต็มและอื่น ๆ

จากการอ้างอิงคลาส NSNumber :

// Creates and returns an NSNumber object containing a 
// given value, treating it as a BOOL.
+ (NSNumber *)numberWithBool:(BOOL)value

และ:

// Returns an NSNumber object initialized to contain a
// given value, treated as a BOOL.
- (id)initWithBool:(BOOL)value

และ:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue

ที่ดี! ฉันเดาว่าภายในเก็บบูลเป็น 0/1?
ขอบคุณ

5
@harms ถูกต้อง ดังตัวอย่าง: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
Over It

29
เป็นสิ่งที่ควรค่าแก่การชี้ให้เห็นว่าขณะนี้มีไวยากรณ์ที่แท้จริงสำหรับ NSNumbers @YESเหมือนกับ[NSNumber numberWithBool:YES]
jcampbell1

51

ไวยากรณ์ใหม่ตั้งแต่ Apple LLVM Compiler 4.0

dictionary[@"key1"] = @(boolValue);
dictionary[@"key2"] = @YES;

ไวยากรณ์จะแปลงBOOLเป็นNSNumberซึ่งเป็นที่ยอมรับNSDictionaryของ


16

หากคุณกำลังประกาศเป็นลิเทอรัลและคุณใช้ clang v3.1 ขึ้นไปคุณควรใช้ @NO / @YES หากคุณประกาศว่าเป็นลิเทอรัล เช่น

NSMutableDictionary* foo = [@{ @"key": @NO } mutableCopy];
foo[@"bar"] = @YES;

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนั้น:

http://clang.llvm.org/docs/ObjectiveCLiterals.html


1
รับข้อผิดพลาดของคอมไพเลอร์: ชนิดตัวชี้ที่เข้ากันไม่ได้เริ่มต้น NSMutableDictionary * ด้วยนิพจน์ประเภท NSDictionary หากคุณเปลี่ยนการประกาศเป็น NSDictionary แทนรับข้อผิดพลาดของคอมไพเลอร์: วิธีการที่คาดไว้ในการเขียนองค์ประกอบพจนานุกรมที่ไม่พบในวัตถุประเภท NSDictionary *
Tony

1
ลิเทอรัลจะสร้างเท่านั้นNSDictionaryไม่ใช่NSMutableDictionaryไฟล์. ดังนั้นการมอบหมาย@YESให้foo[@"bar"]เป็นไปไม่ได้เนื่องจาก@{ @"key": @NO }ไม่ได้แน่นอน
redhotvengeance

3

ดังที่jcampbell1ชี้ให้เห็นตอนนี้คุณสามารถใช้ไวยากรณ์ตัวอักษรสำหรับ NSNumbers:

NSDictionary *data = @{
                      // when you always pass same value
                      @"someKey" : @YES
                      // if you want to pass some boolean variable
                      @"anotherKey" : @(someVariable)
                      };

-2

ลองสิ่งนี้:

NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
[dic setObject:[NSNumber numberWithBool:TRUE]  forKey:@"Pratik"];
[dic setObject:[NSNumber numberWithBool:FALSE] forKey:@"Sachin"];

if ([dic[@"Pratik"] boolValue])
{
    NSLog(@"Boolean is TRUE for 'Pratik'");
}
else
{
    NSLog(@"Boolean is FALSE for 'Pratik'");
}

if ([dic[@"Sachin"] boolValue])
{
    NSLog(@"Boolean is TRUE for 'Sachin'");
}
else
{
    NSLog(@"Boolean is FALSE for 'Sachin'");
}

ผลลัพธ์จะเป็นดังนี้:

บูลีนเป็นTRUEสำหรับ ' Pratik '

บูลีนเป็นเท็จสำหรับ ' Sachin '


1
คุณยังสามารถทำ[NSNumber numberWithBool:NO]และ[NSNumber numberWithBool:YES].
Alex Zavatone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.