Храните классы Objective-C в массиве и используйте их - PullRequest
0 голосов
/ 15 апреля 2019

Скажем, у меня есть два класса, 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 в заводском методе. Поэтому я думаю, что хорошо иметь что-то подобное. Но я не уверен, как заставить это работать.

EDIT

Я вынул звездочку, но она не сработает:

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 ]

2 голосов
/ 15 апреля 2019

Если я правильно понимаю, чего вы пытаетесь достичь, тогда ваш подход кажется правильным.

Существует только одна вещь, которую необходимо исправить:

for (Class c in arr)

c переменная не является указателем - звездочка должна быть удалена.Ваш код работает.

1 голос
/ 15 апреля 2019

Тип Class не является типом NSObject, и хотя это немного особенный , он подобен объекту или эквивалентен объекту, поэтому вы можете отправлять ему сообщения и сохранять егов коллекциях, как вы делаете.

Звездочка не используется, как говорит @MaxPevsner, потому что Class не используется как обычный указатель на объект.Думайте о Class как о специальном типе, таком как id, который также не получает *, когда вы используете его для ссылки на объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...