2010-03-19 19 views
46

İlk önce NSUserDefaults içine koymak için BOOL değerini NSNumber'e dönüştürüyorum. Daha sonra, ben NSUserDefaults gelen BOOL değerini almak istiyorum, ancak açıkçası ben BOOL yerine NSNumber olsun. Sorularım neler?NSNumber ile BOOL nasıl dönüştürülür ve karşılaştırılır?

  1. NSNumber - BOOL dönüşümü nasıl dönüştürülür?
  2. NSNumber to BOOL değeri nasıl karşılaştırılır.

Şu anda var:

if (someNSNumberValue == [NSNumber numberWithBool:NO]) { 
    do something 
} 

karşılaştırma için daha iyi bir yol mu?

Teşekkürler!

+1

Belki, belki de [NSNumber için] okuyun (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html)? ? –

+2

@HotLicks Aşırı derecede basit ve araştırılmamış sorularla öfkenizi anlıyorum. Ancak, gerçek bir Boole veri türü sunan daha modern dillerle deneyimlenenler için, C ve Objective-C'deki bir booleanın simülasyonu oldukça kafa karıştırıcıdır - basit olmaktan çok uzaktır. –

cevap

127

Şu anda iki göstericiyi karşılaştırıyorsunuz. Karşılaştırma için beni bu şekilde okunması kolay olacağını sayesinde

BOOL b = [num boolValue]; 

:

if([someNSNumberValue isEqualToNumber:[NSNumber numberWithBool:NO]]) { 
    // ... 
} 

bir NSNumber kullanım -(BOOL)boolValue gelen bool değeri elde etmek için: İki aslında karşılaştırmak yerine NSNumber s yöntemleri kullanın:

:
if([num boolValue] == NO) { 
    // ... 
} 
+0

Harika! Şimdi nasıl çalışması gerektiğini anlıyorum. Çok teşekkürler! – Jakub

+0

@GeorgFritzsche Ben ikinci sivrilen ilk olanın üzerine taşımak ve öncelikle kullanımını tavsiye öneririm. Birincisi "daha az verimli" - Burada erken optimizasyon yapmak istemiyorum, ama neden gereksiz bir 'NSNumber' örneği yaratıyorsunuz? –

+0

@ H2CO3: Oradan daha iyi bir seçenek elde etmek için ilk yanıt verdiğim OP'den gelen orijinal kod parçasına bir göz atın. –

1

NSUserDefaults

şeffaf Boolean ile çalışmak üzere iki yöntem vardır

- (BOOL)boolForKey:(NSString *)defaultName

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName

0

Ben onun NSConcreteValuebir NSNumber 'ın "booleanity" finagle başardı SADECE yolu (doh!) aşağıdaki beraberdim ...

id x = [self valueForKey:@"aBoolMaybe"]; 
if ([x respondsToSelector:@selector(boolValue)] && 
    [x isKindOfClass:objc_getClass("__NSCFNumber")]) 
    [self doSomethingThatExpectsABool:[x boolValue]]; 

Diğer her hile ... FAILED. Alıcı dikkat, bu değil (__NSCFNumber belki de platform/makine belirli olabilir - sadece Apple'ın uygulama detayı) ama onlar dedikleri gibi .. başka hiçbir şey çalıştı!

İlgili konular