2012-04-18 44 views
8

Tôi gặp hai mảng, CụTiếp cận giá trị từ mảng các đối tượng

NMutableArray* first; 
NMutableArray* second; 

Bây giờ tôi sao chép đối tượng đầu tiên đến các mảng thứ hai như

for (int i=0;i<first.count; i++) 
{ 
[second addObject:[first objectAtIndex:i]; 
} 

này là ok. Tôi không biết cách truy cập giá trị của mảng đầu tiên. Tôi đã thử cách này,

[second addObject:[[first objectAtIndex:i]name]]; 

Tôi muốn lấy giá trị tên nằm trong đối tượng đầu tiên của mảng đầu tiên. Tôi đã thử sử dụng dòng trên, nó đang hiển thị một số cảnh báo. Xin hãy giúp tôi

Trả lời

7

Giả sử bạn bắt đầu với một mảng như thế này:

NSArray *array1 = @[@{@name : @"Fred"}, 
        @{@name : @"Bill"}]; 

Bạn có thể tạo một mảng thứ hai có chứa các giá trị của một tài sản được của mỗi phần tử của mảng đầu tiên như sau:

NSArray *array2 = [array1 valueForKey:@"name"]; 

Nếu sau đó bạn đăng nhập lần thứ hai y ...

NSLog(@"%@", array2); 

... kết quả đầu ra sẽ là

2012-04-18 16:26:11.226 ExampleRunner[23320:707] (
    Fred, 
    Bill 
) 

EDIT

Lưu ý rằng điều này sẽ làm việc bất kể các đối tượng trong mảng đầu tiên là trường hợp của NSDictionary như được hiển thị trong ví dụ ở trên hoặc các phiên bản của lớp hoặc lớp có thuộc tính hoặc biến mẫu name (hoặc biến số _name đối tượng).Để biết thêm thông tin về cách thức và lý do tại sao các công trình này, hãy xem tài liệu cho các giao thức không chính thức NSKeyValueCoding:

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

+0

Hi @ jlehr, tôi không chắc chắn có bao nhiêu đối tượng tôi sẽ thêm vào trong mảng đầu tiên. Trong trường hợp đó, tôi nghĩ giá trị Key sẽ không phù hợp. Đúng ? – Perseus

+0

@ user562100 Tôi không chắc tôi đã hiểu câu hỏi của bạn. Bạn có thể làm rõ? – jlehr

1

trả lời Cập nhật:

Một lần nữa, tôi nghĩ bạn nên chia công cụ ra vào dễ dàng để phân tích dòng mã:

for (id theObject in first) 
{ 
    // without an actual type, I still think the compiler might 
    // throw a warning on this next line of code; 
    // but maybe RJR III is correct and it won't warn. 
    // I didn't check. 
    NSString * nameOfObject = [theObject name]; 
    if(nameOfObject) 
    { 
     [second addObject:nameOfObject]; 
    } 
} 

Chú ý rằng tôi làm một số kiểm tra lỗi trong ở đây là tốt (tức là đảm bảo tên không phải là nil).

gốc trả lời:

Bạn đang nhận được một cảnh báo vì trình biên dịch không biết những loại đối tượng tùy chỉnh đang được lấy từ cuộc gọi của bạn để "[first objectAtIndex: i]". Nói cách khác, nó không biết loại đối tượng bạn đang cố gắng để có được "name" của.

Truyền sang đúng loại và bạn sẽ loại bỏ cảnh báo.

Hoặc thậm chí tốt hơn, tách một dòng nhiều thứ xảy ra cùng một lúc thành hai hoặc ba dòng mã và làm cho mã của bạn dễ đọc hơn trong quá trình.

+0

'-objectAtIndex: 'trả về một' id', vì vậy đúc để loại đúng là không cần thiết, thậm chí với tính nghiêm ngặt của ARC. –

+0

Nếu tôi đang cố truy cập đối tượng bằng [addObject thứ hai: [first objectAtIndex: i]]; nó đang làm việc. Nhưng tôi muốn truy cập vào giá trị cụ thể của trong đối tượng đầu tiên của mảng đầu tiên. – Perseus

3

Các dấu ngoặc hiện đang ở vị trí sai:

[second addObject:[[first objectAtIndex:i] name]]; 
+2

+1 cho câu trả lời của bạn bởi vì tôi không nhận thấy rằng các dấu ngoặc của OP trên một dòng đó đều bị rối tung lên. Sheesh –

+0

Tôi thực sự xin lỗi vì tôi đã nhập sai các thẻ đó trong câu hỏi. Bây giờ tôi đã cập nhật nó. – Perseus

+0

@ user562100 bạn vẫn gặp khó khăn trong việc đặt câu hỏi cập nhật của mình. Tôi thấy ba "[" ký tự và chỉ có hai ký tự "]". –

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