是否可以指定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
感谢您的帮助
答案 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;