изменить тип с id на подклассный nsmanagedobject

#cocoa

#cocoa

Вопрос:

Мне нужно, чтобы метод bsc этой операции получал идентификатор, и мне нравится использовать синтаксис точки для установки объекта позже. В настоящее время я делаю таким образом. Но, может быть, кто-нибудь знает более элегантный способ?

 -(NSError *) updateObject:(id)object operation:(NSInteger)operation;
{
CurrentCompany *obj1 = nil;
 ...
CompanyStuff *obj2 = nil;


if ([[[(CurrentCompany *)object entity] name] isEqualToString:@"CurrentCompany"]) obj1 = (CurrentCompany *)object;
if ([[[(CompanyStuff *)object entity] name] isEqualToString:@"CompanyStuff"]) obj2 = (CompanyStuff *)object;

NSLog(@"UpdatedObject:%@",obj1);
  

Ответ №1:

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

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

Комментарии:

1. @Chunk простота кода приветствуется. вы имеете в виду что-то вроде CurrentCompany *obj1 = amp;object?

2. @Alex: object уже содержит указатель на объект. amp;object является указателем на object переменную, а не на объект. Попытка присвоить этот указатель переменной, типизированной как содержащая указатель на объект (например, CurrentCompany * ), вызовет проблемы.

3. @Peter Hosey какую проблему я могу ожидать?

4. Попытка отправить сообщение указателю на что-то, что не является объектом, приведет к сбою.