Bagaimana cara menambahkan nilai boolean ke NSDictionary?

112

Nah, untuk integer yang akan saya gunakan NSNumber. Tapi YA dan TIDAK bukanlah objek, kurasa. Afaik saya hanya bisa menambahkan objek ke sebuah NSDictionary, kan?

Saya tidak dapat menemukan kelas pembungkus untuk boolean. Apakah ada?

Terima kasih
sumber

Jawaban:

156

Anda menggunakan NSNumber.

Ia memiliki init ... dan number ... metode yang mengambil boolean, seperti halnya integer dan seterusnya.

Dari referensi kelas NSNumber :

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

dan:

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

dan:

// Returns the receiver’s value as a BOOL.
- (BOOL)boolValue
bahaya
sumber
Bagus! Saya kira secara internal itu menyimpan bool sebagai 0/1?
Terima kasih
5
@hamil benar. Sebagai contoh: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It
29
Perlu diperhatikan, bahwa sekarang ada sintaks literal untuk NSNumbers. @YESadalah sama dengan[NSNumber numberWithBool:YES]
jcampbell1
51

Sintaks baru sejak Apple LLVM Compiler 4.0

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

Sintaksnya diubah BOOLmenjadi NSNumber, yang dapat diterima menjadi NSDictionary.

Brian
sumber
16

Jika Anda mendeklarasikannya sebagai literal dan menggunakan clang v3.1 atau yang lebih baru, Anda harus menggunakan @NO / @YES jika Anda mendeklarasikannya sebagai literal. Misalnya

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

Untuk info lebih lanjut tentang itu:

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

sabalaba
sumber
1
Dapatkan kesalahan kompiler: Jenis penunjuk tidak kompatibel yang menginisialisasi NSMutableDictionary * dengan ekspresi jenis NSDictionary. Jika Anda mengubah deklarasi menjadi NSDictionary, dapatkan kesalahan kompiler: Metode yang diharapkan untuk menulis elemen kamus tidak ditemukan pada objek tipe NSDictionary *
Tony
1
Literal hanya akan membuat NSDictionary, bukan NSMutableDictionary. Jadi penugasan @YESke foo[@"bar"]tidak mungkin karena @{ @"key": @NO }tidak bisa diubah.
redhotvengeance
3

Seperti yang ditunjukkan jcampbell1 , sekarang Anda dapat menggunakan sintaks literal untuk NSNumbers:

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

Coba ini:

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

Outputnya adalah sebagai berikut:

Boolean BENAR untuk ' Pratik '

Boolean SALAH untuk ' Sachin '

NSPratik
sumber
1
Anda juga bisa melakukan [NSNumber numberWithBool:NO]dan [NSNumber numberWithBool:YES].
Alex Zavatone