2013-06-06 3 views
3

В моем приложении я должен проанализировать объект, и я делаю это:IOS: определить родовой объект

if ([object_selected isKindOfClass:[Person class]]) { 

    Persone *obj = (Persone*)object_selected; 
    NSString *name = obj.nome; 
    NSString *surname = obj.surname; 

} 
else if ([object_selected isKindOfClass:[Animal class]]) { 

     Animal *obj = (Animal*)object_selected; 
     NSString *name = obj.nome; 
     NSString *breed = obj.breed; 

    } 

в этом случае я должен проверить, если мой объект принадлежит к классу, чтобы получить свою собственность, но есть более быстрый способ получить свойство «имя» от моих объектов? Все объекты имеют свойство «имя».

благодарит

+0

Просто используйте [OBJ имя], вы будете получать предупреждение, но если все объекты, отвечает этому свойству он работает, если объект Безразлично 't отвечать на свойство «name», приложение выйдет из строя, когда вы попытаетесь получить к нему доступ. –

ответ

0

Вы можете просто позвонить [object_selected name], хотя вы можете получить предупреждения компилятора, name may not be a property (или аналогичный).

+0

Является ли это свойство именем 'name' или' nome'? Я просто заметил свойство, которое вы вызываете внутри 'if' /' else if' is 'nome', но свойство, указанное вами в вашем вопросе, -' name'. – neilvillareal

1

Сделайте протокол в отдельном файле .h. Код будет выглядеть примерно следующим образом:

@protocol NamedObjectProtocol

@property (неатомической, сильный) NSString * название;

@end

Затем сделать оба класса объекта объявить соответствие этому протоколу. Затем вы можете разрезать спагетти if/else и получить свойство, подобное этому, независимо от того, является ли anObject экземпляром класса Person или Animal.

id <NamedObjectProtocol> namedObject = anObject; 
NSString *name = namedObject.name; 

Вы должны также рассмотреть вопрос о принятии Animal и Person классов наследует от суперкласса, который имеет все общие черты, такие как собственность имени. Это позволит вам писать код, как:

Character *character = anObject; 
NSString *name = character.name; 
1

Вы можете использовать Key-value coding для безопасного доступа к свойству. Просто используйте:

NSString* name = [object_selected valueForKey:@"nome"] 

Преимуществом этого является то, что приложение не будет вылетать, если object_selected не имеет свойство name, в этом случае значение переменной name будет nil.

Другой способ избежать аварии, чтобы проверить, если объект реагирует на селектор, как этот

if ([object_selected respondsToSelector:@selector(name)]) { 
//... 
} 
+0

Я как раз собирался предложить то же самое. Существует один недостаток этого подхода. В качестве программиста вы не можете определить, является ли значение существующего свойства равным нулю (которое может иметь значение или указывает на ошибку) или просто не существует (что может просто указывать, что объект имеет другой класс). –

2

Посмотрите на Objective-C protocols at apple developer docs.

Короче говоря: Вы можете определить все свойства, необходимые в протокол, сделайте ваши занятия (Лицо, Животное и т. д.) следуйте за ним, а затем используйте [object_selected conformsToProtocol:MyProtocol], чтобы безопасно получить следующее:

if ([object_selected conformsToProtocol:MyNamingProtocol]) { 
    id<MyNamingProtocol> namedObject = object_selected; 
    NSString *name = [namedObject name]; 
} 
3

Вышеупомянутый код имеет общую проблему: всякий раз, когда отсутствует свойство name, он сбрасывает ядро. Вот моя версия, что это чертовски много безопаснее, и один вкладыш:

id name = ([object respondsToSelector:@selector(name)]) ? [object name] : nil; 

Надежда тройной оператор не confise вас.Ноль может быть заменен на то, что соответствует, если имя не присутствует, как:

static NSDictionary *defaultNameForClasses = @{@"FooClass": @"Foo", /* ... */}; 
// ... 
id name = ([object respondsToSelector:@selector(name)]) ? [object name] : defaultNameForClasses[NSStringFromClass([object class])]; 
Смежные вопросы