2013-04-15 7 views
0

У меня есть словарь, который содержит имя строки класса в качестве ключа и массив соответствующих объектов класса в качестве значения.Назначение динамического типа класса

Это может быть несколько разных типов классов, которые входят, поэтому я хотел выполнить динамическое назначение во время выполнения.

Кто-нибудь знает, почему этот код дает ошибку компилятора?

// Where obj is an object of type MyClass 
Class myClass = NSClassFromString(@"MyClass"); 
myClass *objectOfTypeMyClass = obj; 

Update:

Вот как я в конечном итоге его реализации:

Class interestClass = NSClassFromString(classProvidedAsString); 
id interest = [interestClass createNewInterestUsingManagedObjectContext:backgroundContext]; 
[interest setValue:title forKey:@"title"]; 
[interest addLikedByObject:aFriend]; 

Где название является собственностью на все объекты, которые я могу принять, и createNewInterest способ все объекты имеют.

Проблема заключалась в том, чтобы использовать id как interestClass для использования свойств и методов этого класса.

+1

То, что вы хотите, невозможно. 'NSStringFromClass()' - это функция, которая будет оцениваться во время выполнения - вы хотите, чтобы информация была доступна во время компиляции. Если все объекты отвечают на одни и те же методы, тогда вы можете использовать «протокол» для достижения этого –

+0

. Я использовал идентификатор и протокол, чтобы гарантировать, что все они ответили на определенное сообщение. Я использовал Class myClass = NSClassFromString (@ "MyClass"); для его создания, а kvc - для установки свойств. Все хорошо, спасибо! –

+0

Вы использовали 'протокол' и' KVC'? если вы использовали протокол, то «KVC» не требуется, и, используя его, вы теряете возможность проверки компилятора с помощью «протокола», поэтому вы также можете не использовать «протокол». –

ответ

0

Вы можете сделать это так:

NSObject *object=[NSObject new];//this can hold any kind of object 

[email protected]"my name is lakhan";//as string 
NSLog(@"%@",object); 

[email protected][@(10),@(50)]; //now working as array 
NSLog(@"%@",object); 

[email protected]{@"k1": @"10", @"k2":@"20"}; // as dictionary 
NSLog(@"%@",object); 

Так согласно вашему требованию, вы можете использовать любое значение, которое необходимо установить на объекте.

+0

Любые технические причины, по которым вы предпочли 'NSObject *' над 'id'? –

+0

NSObject - это базовый класс для всех. Даже Id будет работать. –

+0

ОК, но я хочу использовать NSStringFromClass, поэтому я могу приписать свой id obj и иметь доступные ему свойства и методы. Это возможно? –

2

Почему просто вы не используете id?

id objectOfTypeMyClass = obj; 

Другой вариант - использовать полиморфизм (если классы были созданы вами).

Смежные вопросы