将Objective-C类存储在数组中并使用

时间:2019-04-15 14:19:08

标签: objective-c

说我有两个类BulbDeviceFanDevice,它们都是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存储在数组中?但是也很难找到访问类方法的方法。

2 个答案:

答案 0 :(得分:2)

如果我正确理解您要实现的目标,那么您的方法似乎是正确的。

只有一件事需要修复:

for (Class c in arr)

c变量不是指针-应删除星号。您的代码有效。

答案 1 :(得分:1)

Class类型不是NSObject类型,尽管it is a bit special是类对象或等效对象,所以您可以向其发送消息并将其存储在集合中就像你在做。

您不会像@MaxPevsner所说的那样使用星号,因为Class并不用作普通的指向对象的指针。将Class视为一种特殊类型,例如id,当您使用它引用对象时也不会得到*