我正在寻找在Objective-C中使用点符号的更简洁方法

时间:2016-01-20 01:04:40

标签: objective-c

我有一个类如下,我使用NSMutableArray来存储MyClass对象的列表。

@interface MyClass: NSObject{
    NSString* _name;
}
@property(nonatomic)NSString* name;

NSMutableArray* array = [NSMutableArray arrayWithCapacity:2];

[array addObject:[[MyClass alloc]init]];
[array addObject:[[MyClass alloc]init]];

我必须进行强制转换才能从数组中获取名称。

((MyClass*)array[0]).name

是否有更简洁的方法可以从name引用MyClass

2 个答案:

答案 0 :(得分:3)

我不知道为什么@matt在他的回答中没有显示轻量级泛型的语法,但这里是:

NSMutableArray<MyClass *>* array = [NSMutableArray arrayWithCapacity:2];

现在,array[0]的类型为MyClass *,而不仅仅是id,因此可行:

array[0].name

答案 1 :(得分:2)

是。如果array只包含 MyClass对象,则可以使用轻量级泛型为编译器提供有关其包含内容的提示,从而无需进行强制转换。< / p>

另外,请注意,即使没有泛型,也可以分配而不用投射(因为可以将id分配到任何对象引用中):

MyClass* c = array[0];
NSString* name = c.name;

或者,正如@rmaddy指出的那样,完全放弃dot-syntax并直接调用getter;这是有效的,因为任何消息都可以发送到id

NSString* name = [array[0] name];

或者,使用KVC将name属性作为数组获取:

NSArray* names = [array valueForKey:@"name"];

Objective-C 仍然不知道names包含什么(除非你使用轻量级泛型),但现在你可以说,例如。

NSString* name = names[0];