说我有两个类BulbDevice
和FanDevice
,它们都是Device
的子类,并且具有这样的方法签名:
+ (BOOL)isMyId:(NSInteger)someId;
如果我想创建一个类,可以对其进行测试:
if ([BulbDevice isMyId:someId]) {
Device *dev = [BulbDevice alloc] initWithId:someId];
}
但是我真正想要的是在工厂类中创建一个工厂方法,在添加新设备时要大惊小怪:
+ (Device)createDevice:(NSInteger)someId {
// say I have an array registered
NSArray *arr = @[[BulbDevice class], [FanDevice class]];
// Loop through it.
Device *device;
for (Class *c in arr) {
// The idea is kind of like this but I'm not sure how to make it work
if ([c isMyId]) {
device = [[c alloc] init];
}
}
}
这个想法是我只需要在工厂方法中更新arr
。因此,我认为拥有这样的东西是很好的。但是我不确定如何使它工作。
编辑:
我删除了星号,但是它不起作用:
for (Class c in arr) {
// Now I want to access the isMyId which is a static method,
// but I how do I cast to that class? I mean not an object of the class, but to that class itself.
if ([(Device)c isMyId:]) {
}
}
但是我仍然需要一种访问该类方法的方法。错误显示Used type 'Device' where arithmetic or pointer type is required
,即使它有效,我也想访问类方法,而不是向对象发送消息。
还是应该将NSString
存储在数组中?但是也很难找到访问类方法的方法。
答案 0 :(得分:2)
如果我正确理解您要实现的目标,那么您的方法似乎是正确的。
只有一件事需要修复:
for (Class c in arr)
c
变量不是指针-应删除星号。您的代码有效。
答案 1 :(得分:1)
Class
类型不是NSObject
类型,尽管it is a bit special是类对象或等效对象,所以您可以向其发送消息并将其存储在集合中就像你在做。
您不会像@MaxPevsner所说的那样使用星号,因为Class
并不用作普通的指向对象的指针。将Class
视为一种特殊类型,例如id
,当您使用它引用对象时也不会得到*
。