设定:
ViewController
拥有MyArray
中的PersonClass
个对象。
PersonClass
只有两个属性:name
和age
。
问题:
当我想从name
中的第一个对象中读出MyArray
属性时,是否有正确的方法来执行此操作?
我是否必须暂时创建PersonClass
这样的实例?
PersonClass *tmp = [PersonClass alloc] init];
tmp = [MyArray objectAtIndex:0];
NSLog(@"%@", tmp.name);
或者我可以直接推荐properties
中objects
的{{1}}吗?
这样的事情:
MyArray
答案 0 :(得分:6)
我强烈建议使用
[(PersonClass *)[MyArray objectAtIndex:0] name]
而不是看似更清洁,但更麻烦的形式
[[MyArray objectAtIndex:0] name]
这有两个原因。首先,对于读者来说,明确指出哪个对象被调用。其次,对于编译器来说它是显式的 - 如果两个方法共享相同的名称,但不同的返回值可能会令人讨厌。 Cocoa With Love的Matt Gallagher有excellent explanation of this issue.
答案 1 :(得分:0)
你可以这样做
PersonClass *tmp = (PersonClass *) [MyArray objectAtIndex:0];
NSLog(@"%@",tmp.name);
或者我们可以将它放在一行:
NSLog(@"%@",((PersonClass *)[MyArray objectatIndex:0]).name);
NSLog(@"%@", [self.contactsArray objectAtIndex:0].name);
不起作用的原因是您没有告诉编译器[self.contactsArray objectAtIndex:0]
处的对象类型是什么。因为它不知道数组中的对象类型,所以它无法知道它具有name
属性
答案 2 :(得分:0)
((PersonClass *)[MyArray objectAtIndex:0]).name
或仅[[MyArray objectAtIndex:0] name]
答案 3 :(得分:0)
我是否必须像这样暂时创建一个PersonClass实例?
PersonClass *tmp = [PersonClass alloc] init]; tmp = [MyArray objectAtIndex:0]; NSLog(@"%@", tmp.name);
没有。只需使用
PersonClass *tmp = (PersonClass *)[myArray objectAtIndex:0];
NSLog(@"%@", tmp.name);
由于你从myArray获取的对象是(或应该是!)已经被添加到数组之前已经被分配并初始化了。数组中的东西是指向对象的指针。这就是你要传递的东西。你必须告诉它你在那里有哪种类型的对象(演员是(PersonClass *)
),因为NSArray只存储NSObjects。
你也可以在一行中这样做
((PersonClass *)[myArray objectAtIndex:0]).name;
答案 4 :(得分:0)
如果你想要或需要这种类型,那么引入类似的类型:
PersonClass * person = [array objectAtIndex:0];
我经常为可读性做这件事,因为包含文件的声明可能会破坏事情。
请注意,从id
值分配objc变量时,不需要强制转换。
我是否必须临时创建PersonClass的实例?
没有。你编写的程序创建了一个永远不会使用的临时程序。