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和使用它们.
或者,您可以将其声明为属性.
你得到的是这个错误,因为就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执行此操作.
| 归档时间: |
|
| 查看次数: |
8266 次 |
| 最近记录: |