NSMutableArray只包含特定类型的对象

leo*_*hab 3 objective-c nsmutablearray

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

@interface MyObject : NSObject {
    UInt8 value; 
}
Run Code Online (Sandbox Code Playgroud)

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

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

因为我收到了这个错误:

request for member 'value' in something not a structure or union
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

Jas*_*ien 15

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

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

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

你可以使用respondsToSelector:.

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

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

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

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

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


Dou*_*aan 7

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

for (MyObject *myObject in myArray) {
Run Code Online (Sandbox Code Playgroud)

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