Làm cách nào để thêm giá trị boolean vào NSDictionary?


112

Vâng, tôi sẽ sử dụng số nguyên NSNumber. Nhưng CÓ và KHÔNG không phải là đối tượng, tôi đoán vậy. Afaik Tôi chỉ có thể thêm các đối tượng vào một NSDictionary, phải không?

Tôi không thể tìm thấy bất kỳ lớp trình bao bọc nào cho boolean. Có cái nào không?

Câu trả lời:


156

Bạn sử dụng NSNumber.

Nó có các phương thức init ... và number ... sử dụng boolean, giống như các số nguyên, v.v.

Từ tham chiếu lớp NSNumber :

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

và:

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

và:

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

Tuyệt quá! Tôi đoán nội bộ nó lưu trữ bool là 0/1?
Cảm ơn

5
@harms là đúng. Ví dụ: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It,

29
Điều đáng chỉ ra là bây giờ có một cú pháp theo nghĩa đen cho NSNumbers. @YEScũng giống như[NSNumber numberWithBool:YES]
jcampbell1

51

Cú pháp mới kể từ Apple LLVM Compiler 4.0

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

Cú pháp chuyển đổi BOOLthành NSNumber, được chấp nhận thành NSDictionary.


16

Nếu bạn đang khai báo nó dưới dạng một ký tự và bạn đang sử dụng clang v3.1 trở lên, bạn nên sử dụng @NO / @YES nếu bạn đang khai báo nó dưới dạng một ký tự. Ví dụ

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

Để biết thêm thông tin về điều đó:

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


1
Gặp lỗi trình biên dịch: Loại con trỏ không tương thích khởi tạo NSMutableDictionary * với biểu thức kiểu NSDictionary. Nếu bạn thay đổi việc kê khai để NSDictionary thay vào đó, có được trình biên dịch báo lỗi: Dự kiến phương pháp để viết Từ điển yếu tố không tìm thấy trên đối tượng của loại NSDictionary *
Tony

1
Nghĩa đen sẽ chỉ tạo ra một NSDictionary, không phải một NSMutableDictionary. Vì vậy, không thể gán @YEScho foo[@"bar"]@{ @"key": @NO }không thể thay đổi.
redhotvengeance

3

Như jcampbell1 đã chỉ ra, bây giờ bạn có thể sử dụng cú pháp theo nghĩa đen cho NSNumbers:

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

-2

Thử cái này:

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'");
}

Đầu ra sẽ như sau:

Boolean là TRUE cho ' Pratik '

Boolean là FALSE cho ' Sachin '


1
Bạn cũng có thể làm [NSNumber numberWithBool:NO][NSNumber numberWithBool:YES].
Alex Zavatone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.