2008-12-25 22 views

Trả lời

44

Nếu bạn muốn sử dụng một NSArray bạn sẽ cần phải hộp lên struct của bạn. Bạn có thể sử dụng lớp NSValue để mã hóa chúng.

Something như thế này để mã hóa:

struct foo { 
    int bar; 
}; 

struct foo foobar; 
foobar.bar = 3; 
NSValue *boxedFoobar = [NSValue valueWithBytes:&foobar objCType:@encode(struct foo)]; 

Và sau đó để có được nó lại ra:

struct foo newFoobar; 

if (strcmp([boxedFoobar objCType], @encode(struct foo)) == 0) 
    [boxedFoobar getValue:&newFoobar]; 
+1

Một gợi ý hay, mặc dù có một cú đánh đấm hiệu suất và unboxing. Nó không khủng khiếp, nhưng đáng chú ý nếu bạn cần tốc độ. –

11

Nếu bạn đang okay với một mảng C cũ thường xuyên:

struct foo{ 
    int bar; 
}; 

int main (int argc, const char * argv[]) { 
    struct foo foobar[3]; 
    foobar[0].bar = 7; 
} 

Nếu bạn muốn một NSArray, bạn sẽ cần một đối tượng wrapper. Hầu hết các nguyên thủy sử dụng NSNumber, nhưng điều đó có thể không được áp dụng cho cấu trúc của bạn. Một wrapper sẽ không phải là rất khó để viết, mặc dù loại đánh bại mục đích của việc sử dụng một cấu trúc!

Chỉnh sửa: Đây là điều tôi chưa làm nhưng chỉ nghĩ đến. Nếu bạn nghĩ về nó, một NSDictionary về cơ bản là một cấu trúc cho các đối tượng. Các khóa của bạn có thể là tên của các thành phần cấu trúc như NSStrings và các giá trị của bạn có thể là kiểu dữ liệu tương ứng được bao bọc trong trình bao bọc Cocoa áp dụng. Sau đó, chỉ cần đặt những bộ từ điển này trong một NSArray.

Tôi đoán ý chính là bạn có nhiều tùy chọn. Nếu tôi là bạn tôi sẽ làm một số thử nghiệm và xem những gì hoạt động tốt nhất.

20

Hoặc tự động phân bổ:

struct foo { 
    int bar; 
}; 

int main (int argc, const char * argv[]) { 
    struct foo *foobar = malloc(sizeof(struct foo) * 3); 
    foobar[0].bar = 7; // or foobar->bar = 7; 

    free(foobar); 
} 
2

Liệu nó cần phải là một struct? Nó thường tốt hơn để làm cho nó một đối tượng nếu bạn có thể. Sau đó, bạn có thể sử dụng những thứ như KVC và Bindings với nó.

+0

Hey Peter, ngay bây giờ tôi không nghĩ rằng tôi cần những người đó, nhưng đó vẫn là một chủ đề mà tôi quan tâm. Tôi vừa mở một câu hỏi cụ thể: http://stackoverflow.com/questions/393662 –

0

Dễ sử dụng lớp hơn, nhưng nếu bạn cần làm việc với các cấu trúc C và c mục tiêu như CGRect hoặc các cấu trúc khác. Tôi đã cố gắng sử dụng NSValue, nhưng nó hoạt động kỳ lạ ...:

CGRect rect =CGRectMake(20,220,280,30); 
NSValue* rectValue = [NSValue valueWithCGRect:rect]; 
NSArray *params1; 
params1= [NSArray arrayWithObjects:rectValue,nil]; 

Nhưng, tôi có thể nhận được giá trị CGRect chỉ như:

CGRect cgr = [[params1 objectAtIndex:0] CGRectValue]; 

Khi tôi sử dụng này:

id currentVal = [params1 objectAtIndex:0]; 
void* buffer; 
buffer=[currentVal pointerValue]; 

nó gây ra lỗi ...


vấn đề được giải quyết here

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