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?

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

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.


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


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

-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 '


1
Anda juga bisa melakukan [NSNumber numberWithBool:NO]dan [NSNumber numberWithBool:YES].
Alex Zavatone
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.