3

在我的应用程序中,我应该分析一个对象并执行以下操作:

 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;

    }

这样我应该验证我的对象是否属于一个类以获取其属性,但是有没有更快的方法从我的对象中获取属性“名称”?所有对象都有“名称”属性。

谢谢

4

5 回答 5

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])];
于 2013-06-06T09:18:35.983 回答
2

看看苹果开发者文档中的 Objective-C 协议。

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

if ([object_selected conformsToProtocol:MyNamingProtocol]) {
  id<MyNamingProtocol> namedObject = object_selected;
  NSString *name = [namedObject name];
}
于 2013-06-06T09:12:35.453 回答
1

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

@protocol 命名对象协议

@property (nonatomic, strong) NSString *name;

@结尾

然后,使两个对象类都声明符合此协议。然后,您可以剪切 if/else 意大利面条并获得这样的属性,无论anObject是 aPerson还是Animal类的实例。

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

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

Character *character = anObject;
NSString *name = character.name;
于 2013-06-06T09:02:31.090 回答
1

您可以使用键值编码来安全地访问该属性。只需使用:

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

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

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

if ([object_selected respondsToSelector:@selector(name)]) {
//...
}
于 2013-06-06T09:05:50.140 回答
0

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

于 2013-06-06T08:53:29.670 回答