从对象数组中访问值

时间:2012-04-18 18:49:54

标签: iphone ios cocoa-touch cocoa foundation

我有两个数组,即

NMutableArray* first;
NMutableArray* second;

现在我将第一个对象复制到第二个数组,如

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

这没关系。我不知道如何访问First Array的值。我试过这个,

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

我想获取第一个数组的第一个对象中的名称值。我尝试使用上面的一行,它显示了一些警告。请帮帮我

3 个答案:

答案 0 :(得分:7)

假设你开始使用这样的数组:

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

您可以创建第二个数组,其中包含第一个数组的每个元素的给定属性的值,如下所示:

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

如果你然后记录了第二个数组...

NSLog(@"%@", array2);

...结果输出为

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

修改

请注意,无论第一个数组中的对象是NSDictionary的实例(如上例中所示),还是具有name属性或实例的类或类的实例,这都将起作用变量(或_name实例变量,就此而言)。有关其工作原理和原因的更多信息,请参阅NSKeyValueCoding非正式协议的文档:

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

答案 1 :(得分:3)

括号目前位于错误的位置:

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

答案 2 :(得分:1)

更新后的答案:

同样,我认为你应该把东西分成易于解析的代码行:

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];
    }
}

请注意我在这里也做了一些错误检查(即确保名称不是nil)。

原始答案:

您收到警告是因为编译器不知道从您对#34; [first objectAtIndex: i]&#34;的调用中获取了哪种自定义对象。换句话说,它并不知道你试图获得&#34; name&#34;&#34; {{1}}&#34;的。

将其投射到正确的类型,然后你就会摆脱警告。

或者甚至更好,将一行多行事件分成两行或三行代码,并使代码在此过程中更具可读性。