IOS:识别通用对象

时间:2013-06-06 08:50:48

标签: ios objective-c object

在我的应用程序中,我应该分析一个对象,然后我这样做:

 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;

    }

以这种方式我应该验证我的对象是否属于一个类来获取它的属性,但是有更快的方法从我的对象获取属性“name”吗? 所有对象都有“name”属性。

感谢

5 个答案:

答案 0 :(得分:3)

上述代码有一个共同的问题:每当缺少name属性时,它都会转储核心。这是我的版本更安全,更简单:

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

希望三元运营商不要让你担心。如果名称不存在,则可以用适当的替换nil,例如:

static NSDictionary *defaultNameForClasses = @{@"FooClass": @"Foo", /* ... */};
// ...
id name = ([object respondsToSelector:@selector(name)]) ? [object name] : defaultNameForClasses[NSStringFromClass([object class])];

答案 1 :(得分:2)

查看Objective-C protocols at apple developer docs.

长话短说: 您可以在协议中定义所需的所有属性,使您的类(Person,Animal e.t.c)遵循它,然后使用[object_selected conformsToProtocol:MyProtocol]安全地获取如下属性:

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

答案 2 :(得分:1)

在单独的.h文件中创建协议。代码看起来类似于以下内容:

  

@protocol NamedObjectProtocol

     

@property(非原子,强)NSString * name;

     

@end

然后,使两个对象类声明符合此协议。然后,无论anObjectPerson还是Animal类的实例,都可以剪切if / else spaghetti并获取此类属性。

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

您还应该考虑使AnimalPerson类继承自具有所有共性的超类,例如name属性。这将允许您编写如下代码:

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

答案 3 :(得分:1)

您可以使用Key-value coding安全地访问该物业。只需使用:

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

这样做的好处是,如果object_selected没有名为name的属性,应用程序不会崩溃,在这种情况下,name变量的值将为{{1 }}

避免崩溃的另一种方法是检查对象是否响应选择器,如此

nil

答案 4 :(得分:0)

您可以调用[object_selected name],但您可能会收到name may not be a property(或类似)的编译器警告。