NSMutableArray只包含特定类型的对象

时间:2010-04-28 12:01:20

标签: objective-c nsmutablearray

是否可以指定NSMutableArray只能包含某种类型的对象。 例如,如果我只想存储这种对象:

@interface MyObject : NSObject {
    UInt8 value; 
}

为了能够像这样使用实例变量:

- (void)myMethod:(NSMutableArray *)myArray{
    for (id myObject in myArray){
        [self otherMethod:myObject.value];
    }
}

因为我收到了这个错误:

request for member 'value' in something not a structure or union

感谢您的帮助

6 个答案:

答案 0 :(得分:15)

听起来你是来自Java / C#类型的背景,可以对集合施加限制。

Cocoa中的集合不遵循这种模式。没有办法对可以插入的对象类型设置限制(除非你编写一个强制执行此操作的包装类)。

Objective-C,按照设计,遵循“如果它像鸭子一样行走,它像鸭子一样嘎嘎叫,那么它很可能是一只鸭子”的哲学。也就是说,不管是检查某个对象是否是特定类型,您应该检查它是否可以执行您希望它执行的操作,而不管其类型如何。

您可以使用respondsToSelector:

执行此操作

最后,您的问题实际上与数组没有限制的事实有关。您的对象似乎并未将实例变量value声明为属性,或者为其公开任何存取方法。

这就是您在尝试myObject.value时看到错误的原因。 Objective-C中的语法是您访问属性的方式。

Objective-C中实例变量的默认范围是@protected,这意味着如果不通过某种访问器方法,类外的任何东西都无法访问它们。

您需要声明并定义方法- (UInt8)value- (void)setValue:(UInt8)aValue并使用它们。

或者,您可以将其声明为属性。

答案 1 :(得分:7)

您收到该错误,因为就Objective-C而言,myObject属于非id类型,不支持value属性。为了让Objective-C意识到它总是在这个循环中处理MyObject,你必须告诉它myObject对象是MyObject的一个实例。

for (MyObject *myObject in myArray) {

此外,您必须确保使用点符号可以访问value ivar,方法是为其实现getter和setter方法。您可以通过实施-value-setValue:来自行完成此操作,也可以使用@property@synthesize让Objective-C执行此操作。

答案 2 :(得分:0)

Objective-C不能那样工作。您需要使用[myObject value](无论对象的类型如何,只要它响应-[value],它就会起作用。如果您只想要一种类型的对象,则只插入那种类型的对象。

答案 3 :(得分:0)

您必须为NSMutableArray编写包装类,例如参见this question

答案 4 :(得分:0)

子类NSMutableArray并覆盖调解向数组添加对象的方法。您将检查这些重写方法中的对象类型,如果接受该类型,则仅调用[super addObject:xyz]

答案 5 :(得分:0)

也许你可以使用协议:

@protocol Person <NSObject>
@end

@interface Person : NSObject <Person>
@end

使用:

NSArray<Person>*  personArray;