2009-03-09 34 views
36

Tôi cần sử dụng một mảng các boolean trong mục tiêu-c. Tôi đã có nó chủ yếu được thiết lập, nhưng trình biên dịch ném một cảnh báo tại tuyên bố sau đây:Mục tiêu C Boolean Array

[updated_users replaceObjectAtIndex:index withObject:YES]; 

Đây là, tôi chắc chắn, bởi vì có đơn giản không phải là một đối tượng; đó là một nguyên thủy. Bất kể, tôi cần phải làm điều này, và sẽ đánh giá rất cao lời khuyên về cách thực hiện nó.

Cảm ơn.

+3

Khi hỏi về một cảnh báo xin vui lòng gửi cảnh báo trong câu hỏi :) –

Trả lời

69

Đúng, đó chính xác là gì: vùng chứa NS * chỉ có thể lưu trữ mục tiêu-C đối tượng, không phải kiểu nguyên thủy.

Bạn sẽ có thể thực hiện những gì bạn muốn bằng cách gói nó trong một NSNumber:

[updated_users replaceObjectAtIndex:index withObject:[NSNumber numberWithBool:YES]]

hoặc bằng cách sử dụng @(YES) mà kết thúc tốt đẹp một BOOL trong một NSNumber

[updated_users replaceObjectAtIndex:index withObject:@(YES)]]

Sau đó, bạn có thể kéo ra boolValue:

BOOL mine = [[updated_users objectAtIndex:index] boolValue];

11

Bạn có thể lưu trữ NSNumbers:

[updated_users replaceObjectAtIndex:index 
         withObject:[NSNumber numberWithBool:YES]]; 

hoặc sử dụng một C-mảng, tùy thuộc vào nhu cầu của bạn:

BOOL array[100]; 
array[31] = YES; 
14

Giả sử mảng của bạn chứa các đối tượng có giá trị (và không phải là một c-phong cách mảng):

#define kNSTrue   ((id) kCFBooleanTrue) 
#define kNSFalse  ((id) kCFBooleanFalse) 
#define NSBool(x)  ((x) ? kNSTrue : kNSFalse) 

[updated_users replaceObjectAtIndex:index withObject:NSBool(YES)]; 
+2

Tôi tò mò muốn tìm hiểu tại sao Nicks câu trả lời nhận được sự ủng hộ rất nhiều nhiều hơn một này , vì điều này có vẻ thanh lịch hơn. Bất cứ ai có thể giải thích sự khác biệt? – Chris

8

Giống như Georg đã nói, hãy sử dụng mảng C.

BOOL myArray[10]; 

for (int i = 0; i < 10; i++){ 
    myArray[i] = NO; 
} 

if (myArray[2]){ 
    //do things; 
} 

Martijn, "myArray" là tên mà bạn sử dụng, "mảng" trong ví dụ Georg của.

1

Nếu bộ sưu tập của bạn lớn hoặc bạn muốn nó nhanh hơn đối tượng objc, hãy thử các loại CFBitVector/CFMutableBitVector được tìm thấy trong CoreFoundation. Đó là một trong các loại Bộ sưu tập CF mà không không phải là giao hàng với NS, nhưng nó có thể được bao bọc trong một lớp objc một cách nhanh chóng, nếu muốn.

3

Từ XCode 4.4, bạn có thể sử dụng literive Objective-C.

[updated_users replaceObjectAtIndex:index withObject:@YES];

đâu @YES là tương đương với [NSNumber numberWithBool:YES]