Как мне динамически определить переменную экземпляра? - PullRequest
0 голосов
/ 25 апреля 2010

У меня есть два класса (class1 и class2), которые просто хранят данные, а не методы. У меня есть третий класс, у которого есть переменная экземпляра, которая, в зависимости от некоторого пользовательского ввода, будет установлена ​​в один из двух классов. Итак, в третьем классе я объявляю переменную как

NSObject *aClass;

и во время выполнения установите его на то, что должно быть.

aClass = [[Class1 alloc] init]; // or 
aClass = [[Class2 alloc] init];

Однако, когда я пытаюсь получить доступ к полям из aClass

NSString *str = aClass.field1;

Это дает мне ошибку: запрос на член 'field1' во что-то, не являющееся структурой или объединением. Поле1 объявлено как в class1, так и в class2. Когда я пытаюсь разыграть aClass

aClass = (Class1 *) aClass;

выдает ту же ошибку. Что я делаю не так, есть ли лучший способ сделать это?

Ответы [ 3 ]

4 голосов
/ 25 апреля 2010

Это потому, что свойства работают только тогда, когда компилятор знает класс, с которым он имеет дело. NSObject не имеет свойства с именем field1, поэтому оно не работает.

Однако вы можете использовать field1 метод свойство, неявно созданное:

NSString* str = [aClass field1];

Но если вы делаете это на NSObject, оно выдаст предупреждение.

Если вы не знаете, какой из двух классов у вас будет, и у них нет классовых отношений, я предлагаю вам использовать тип id вместо NSObject. Используя id, компилятор не будет выдавать предупреждения о вызовах методов, которые потенциально могут потерпеть неудачу (но все равно не разрешат ваши свойства).

1 голос
/ 25 апреля 2010

Все, что знает компилятор об aClass, это то, что он является NSObject, поэтому вы можете рассматривать его только как таковой. Иначе, что произойдет, если вы попытаетесь получить доступ к field1, когда aClass указывает на строку NSString? Создайте суперкласс с необходимыми переменными экземпляра и объявите aClass этого типа. Это гарантирует, что aClass будет содержать переменную field1, так что вы можете продолжать работу без проблем с плохим компилятором.

Причина, по которой вы не можете отказаться от NSObject до Class1, следует тому же принципу. aClass может быть чем угодно, а компилятор не знает, как что-либо сделать с Class1. Вы можете привести другой способ, потому что все aClass являются NSObjects, но не все NSObject являются aClass. : D

0 голосов
/ 25 апреля 2010

Почему бы не иметь оба возможных класса наследовать от одного базового класса, который реализует свойство, которое вы пытаетесь определить?

Или создайте категорию с этим свойством, которое реализуют оба класса, и вместо определения переменной NSObject произнесите:

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