2010-01-21 32 views
57

OK, tôi hơi bối rối. Nó có lẽ chỉ là một tầm thường.Từ điển mục tiêu-C chèn một BOOL

Tôi đã có một chức năng mà trông giống như sau:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails { 
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
[parameters setValue:news forKey:@"getNews"]; 
[parameters setValue:mails forKey:@"getMails"];...} 

Nó không quan trọng cho dù tôi sử dụng setValue:forKey: hoặc setObject:ForKey:, tôi luôn nhận được một cảnh báo:

" Đang chuyển đối số 1 của tập hợp ... làm cho con trỏ từ số nguyên mà không có một dàn diễn viên "...

Làm cách nào để chèn một bool vào một dictiona ry?

Trả lời

116

Giá trị trong một NSDictionary phải là đối tượng. Để giải quyết vấn đề này, hãy quấn các booleans vào các đối tượng NSNumber:

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"]; 
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"]; 
+10

Và đừng quên rằng tarting với Clang v3.1, chúng ta có thể sử dụng literals: 'NSNumber * yesNumber = @ YES'; tương đương với '[Số NSNumberWithBool: YES]' – coco

+9

Vì vậy, như @coco nói, bạn có thể sử dụng '@ YES' và' @ NO' làm thay thế cho '[Số NSNumberWithBool: YES]' và '[Số NSNumberWithBool: NO]' tương ứng. Và như @AlBlue chỉ ra dưới đây, cách để lấy giá trị từ từ điển sau này sẽ sử dụng '[[myDictionary objectForKey: theKey] boolValue]'. – RoberRM

+0

Không Không Không. Bạn đang sử dụng setValue, không phải là phương thức NSMutableDictionary, mà là phương thức KVO. Thay vào đó, hãy sử dụng setObject. –

14

Thùng chứa mục tiêu-C chỉ có thể lưu trữ các đối tượng Mục tiêu-C, do đó bạn cần bọc bạn BOOL vào một số đối tượng. Bạn có thể tạo đối tượng NSNumber với [NSNumber numberWithBool] và lưu trữ kết quả.
Sau đó bạn có thể lấy lại giá trị boolean của mình bằng cách sử dụng số -boolValue của NSNumber.

6

Bạn có thể chèn các đối tượng chuỗi @"YES" hoặc @"NO" và Cocoa sẽ đưa nó vào bool khi bạn đọc lại.

Nếu không, tôi khuyên bạn nên tạo từ điển bằng cách sử dụng phương pháp nhà máy như dictionaryWithObjectsAndKeys:.

+0

Đó là âm thanh nguy hiểm - nếu bạn muốn chuỗi? – quantumpotato

+0

Tôi có thể bị nhầm lẫn, nhưng việc sử dụng boolValue và stringValue sẽ mang lại kết quả cần thiết. Cần một boolean? Sử dụng boolValue. Cần một chuỗi? Đi với stringValue. – Eimantas

+0

@Eimantas Tôi chắc chắn thích cách của bạn ...;-) –

8

BOOL không phải là một đối tượng - đó là một từ đồng nghĩa với một int và có 0 hoặc 1 làm giá trị của nó. Kết quả là, nó sẽ không được đặt trong một cấu trúc chứa đối tượng.

Bạn có thể sử dụng NSNumber để tạo trình bao bọc đối tượng cho bất kỳ loại số nguyên nào; có một hàm tạo [NSNumber numberWithBool:] mà bạn có thể gọi để nhận một đối tượng và sau đó sử dụng nó. Tương tự, bạn có thể sử dụng điều đó để lấy lại đối tượng: [obj boolValue].

2

Xem câu trả lời @Steve Harrison Tôi có một nhận xét. Đối với một số lý do, điều này không hoạt động với các thuộc tính đối tượng truyền qua như ví dụ:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"]; 

này đặt phím news để null trong các tham số NSDictionary (đối với một số lý do có thể không thực sự hiểu tại sao)

giải pháp duy nhất của tôi là sử dụng @ cách Eimantas như sau:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"]; 

Điều này hoạt động hoàn hảo. Đừng hỏi tôi tại sao việc chuyển trực tiếp BOOL không hoạt động nhưng ít nhất tôi đã tìm được giải pháp. Bất kỳ ý tưởng?

7

đang hiện đại để tham khảo:

parameters[@"getNews"] = @(news); 
Các vấn đề liên quan