2010-03-19 29 views
46

Đầu tiên tôi chuyển đổi giá trị BOOL thành NSNumber để đặt nó vào NSUserDefaults. Sau đó tôi muốn lấy giá trị BOOL từ NSUserDefaults, nhưng rõ ràng là tôi nhận được NSNumber thay vì BOOL. Câu hỏi của tôi là?Làm thế nào để chuyển đổi và so sánh NSNumber với BOOL?

  1. cách chuyển đổi từ NSNumber sang BOOL?
  2. Cách so sánh giá trị NSNumber với BOOL.

Hiện nay tôi có:

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

bất kỳ cách nào tốt hơn để để so sánh?

Cảm ơn!

+1

Có thể, chỉ cần đọc [spec for NSNumber] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html)? ? –

+2

@HotLicks Tôi hiểu sự bực dọc của bạn với những câu hỏi quá đơn giản và chưa được tìm kiếm. Nhưng đối với những người trong chúng ta có kinh nghiệm với các ngôn ngữ hiện đại hơn cung cấp một kiểu dữ liệu Boolean thực, mô phỏng của một boolean trong C và Objective-C khá khó hiểu - cách xa đơn giản. –

Trả lời

127

Bạn hiện đang so sánh hai con trỏ. Sử dụng NSNumber s phương pháp thay vì để thực sự so sánh hai:

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

Để có được giá trị bool từ một NSNumber sử dụng -(BOOL)boolValue:

BOOL b = [num boolValue]; 

Với rằng việc so sánh sẽ dễ dàng hơn để đọc cho tôi theo cách này:

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

Tuyệt vời! Bây giờ tôi hiểu nó sẽ hoạt động ra sao. Cảm ơn nhiều! – Jakub

+0

@GeorgFritzsche Tôi đề nghị bạn di chuyển thứ hai bị trượt ở trên đầu tiên và đề nghị sử dụng nó chủ yếu. Điều đầu tiên là "kém hiệu quả" - Tôi không muốn thực hiện tối ưu hóa sớm ở đây, nhưng tại sao tạo ra một thể hiện thừa của NSNumber? –

+0

@ H2CO3: Hãy xem đoạn mã gốc từ OP, mà tôi đã trả lời trước tiên, để có được một lựa chọn tốt hơn từ đó. –

1

NSUserDefaults có hai phương pháp để minh bạch hoạt động với các phép toán luận:

- (BOOL)boolForKey:(NSString *)defaultName

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

0

cách duy nhất tôi quản lý để có lợi "booleanity" NSNumber 's từ NSConcreteValue(doh!) là như sau ...

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

Mọi thủ thuật khác ... FAILED. Người mua hãy cẩn thận, điều này là không dễ dàng (__NSCFNumber cũng có thể là nền tảng/máy cụ thể - nó là chỉ chi tiết thực hiện của Apple) ... nhưng khi họ nói .. không có gì khác làm việc!

Các vấn đề liên quan