仅包含特定类型对象的NSMutableArray

3

有没有办法指定 NSMutableArray 只能包含特定类型的对象。例如,如果我只想存储这种类型的对象:

@interface MyObject : NSObject {
    UInt8 value; 
}

为了能够像这样使用实例变量:
```python self.variable_name ```
您需要在类中定义该变量。
- (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个回答

15

听起来你是从Java/C#类型的背景中来的,这些语言中集合的限制可以被强制执行。

Cocoa中的集合不遵循这种模式。除非你编写一个强制执行此规则的包装类,否则无法设置限制插入对象的类型。

Objective-C的设计理念是“如果它走起来像鸭子,叫起来像鸭子,那么它很可能就是一只鸭子”。也就是说,与其检查一个对象是否为特定类型,你应该检查它是否能够做你想让它做的事情,而不管它的类型如何。

你可以使用respondsToSelector:来实现这一点。

最后,你的问题实际上与数组没有限制无关。你的对象似乎没有将实例变量value声明为属性,也没有公开任何访问器方法。

这就是为什么当你尝试使用myObject.value时会出现错误。在Objective-C中,这种语法是用来访问属性的。

Objective-C中实例变量的默认作用域是@protected,这意味着除了通过某种访问器方法之外,类外的任何东西都不能访问它们。

你需要声明并定义方法- (UInt8)value- (void)setValue:(UInt8)aValue并使用它们。
或者,你可以将其声明为属性。

7
您之所以会出现这种错误,是因为在Objective-C中,myObject被认为是非类型id,它不支持value属性。为了让Objective-C意识到在这个循环中始终处理的是MyObject,您需要告诉它myObject对象是MyObject的一个实例。
for (MyObject *myObject in myArray) {

另外,您需要确保通过实现getter和setter方法,可以使用点符号访问value ivar。您可以自己实现-value-setValue:,也可以使用@property@synthesize让Objective-C自动完成。


0

也许你可以使用协议:

@protocol Person <NSObject>
@end

@interface Person : NSObject <Person>
@end

使用方法:

NSArray<Person>*  personArray;

0
Objective-C不是这样工作的。你需要使用[myObject value](无论对象的类型如何,只要它响应-[value]就可以工作)。如果你只想在其中插入一种类型的对象,请只插入该类型的对象。

[myObject value] 没有起作用... 因为这个方法还有其他选项... 我将实例变量重命名为 "myValue",现在 [myObject myValue] 可以正常工作了。 - leochab
引入于Objective-C 2,你也可以使用点语法来访问属性,或者任何不需要参数的方法。因此,myObject.value 在语法上是完全正确的。 - Douwe Maan
只有当编译器知道接收者类型时,才会有某些原因。 - Williham Totland

0

您需要为NSMutableArray编写一个包装类,例如请参考this question


谢谢您提供的链接,我可能很快就需要使用它。好知道。 - leochab

0

子类化NSMutableArray并重写介入对象添加到数组的方法。在这些重写的方法中,您将检查对象类型,仅在接受该类型时调用[super addObject:xyz]


这是一个不好的想法。NSMutableArray是一个抽象类,你不能真正地在没有编写自己的数组实现的情况下对其进行子类化。 - Williham Totland
1
不要使用子类,创建一个包装器。包装器类可以包含一个私有的NSArray实例,并公开一个接口,允许您进行类型检查。 - Jasarien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接