8

我有两个数组,即

NMutableArray* first;
NMutableArray* second;

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

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

还行吧。我不知道如何访问第一个数组的值。我试过这样,

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

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

4

3 回答 3

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_nameNSKeyValueCoding

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

于 2012-04-18T20:29:44.853 回答
3

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

[second addObject:[[first objectAtIndex:i] name]];
于 2012-04-18T18:54:05.057 回答
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];
    }
}

请注意,我也在这里进行了一些错误检查(即确保名称不为零)。

原答案:

您收到警告是因为编译器不知道从您对“ [first objectAtIndex: i]”的调用中获取了哪种自定义对象。换句话说,它不知道你想得到什么样的对象name

将其转换为正确的类型,您将摆脱警告。

或者更好的是,将同时发生的多件事分成两三行代码,让你的代码在这个过程中更具可读性。

于 2012-04-18T18:53:19.897 回答