好的,我有下面的代码(Objective-C FYI),我想知道是否要创建一个 NSMutableArrayc_data
对象,我该怎么做呢?这有点像声明一个List<c_data> cData
in C#.
@interface c_data : NSObject {
double value;
int label;
int ID;
}
@property double value;
@property int label;
@property int ID;
-(c_data*) init;
-(c_data*) initWithValue:(double)value;
@end
@implementation c_data
@synthesize value, label, ID;
-(c_data*) init {
return self;
}
-(c_data*) initWithValue:(double)val {
value = val;
return self;
}
@end
如果你看看班级feat_data
,我正在努力使cData
类的数组c_data
。我已经包括了我的尝试,但我认为这是不对的,因为c_data
不是一个数组。有什么建议么?
@interface feat_data : NSObject {
NSMutableArray *nData;
NSMutableArray *cData;
char type;
}
@property(nonatomic, retain) NSMutableArray *nData;
@property(nonatomic, retain) NSMutableArray *cData;
@property char type;
-(feat_data*)init;
@end
@implementation feat_data
@synthesize nData, cData, type;
-(feat_data*)init {
nData = [[NSMutableArray alloc] init];
c_data *c_dataInstance = [[c_data alloc] init];
cData = [[NSMutableArray alloc] initWithArray:c_dataInstance];
return self;
}
@end
Objective-C 中不存在静态类型/模板/泛型集合之类的东西。基本上,强类型集合的目的是在编译时提供静态类型安全。对于像 Objective-C 这样动态的语言来说,这种方法没有什么意义。解决 Objective-C 集合中不同对象类型问题的方法是仅插入适当的对象类型。 (另外,请记住,数组将保留它包含的对象,因此,如果您插入一个新对象而不释放它,并且丢失了指向该对象的指针,则会泄漏内存。)
如果您考虑一下,泛型的最大好处之一就是能够将集合中的对象直接检索到静态类型变量中,而无需进行强制转换。在 Objective-C 中,你可以直接存储到id
变量并发送您喜欢的任何消息,而不必担心 ClassCastException,或者编译器抱怨对象没有(可能没有?)实现您尝试调用的方法。如果需要,您仍然可以静态键入变量并转换结果,但更简单的方法是使用动态类型(和-isKindOfClass: and -respondsToSelector:如果需要的话)。
顺便说一句,这个问题在 Stack Overflow 上有几个相关的版本。了解要搜索的术语(“通用”、“强类型”或“模板”)可以帮助找到它们。以下是一些:
- 为什么 C# 和 VB 有泛型?它们提供什么好处?
- 有什么方法可以强制在 NSArray、NSMutableArray 等上进行输入吗?
- Cocoa/Objective-C 中有类似通用列表的东西吗?
- Objective-C 中有强类型集合吗?
最后,我同意 William 的观点 - 在您提供的示例中,您的 init 方法非常令人震惊。你最好学习并遵守苹果的规则分配和初始化对象在 Objective-C 中。它需要打破其他语言的习惯,但它会在未来的某个时刻让你免去无尽的疯狂时间。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)