簡體   English   中英

IOS:識別通用對象

[英]IOS: identify a generic 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”屬性。

謝謝

上述代碼有一個共同的問題:每當缺少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])];

在Apple開發人員文檔中查看Objective-C協議。

簡而言之:您可以在協議中定義所需的所有屬性,使您的類(Person,Animal等)遵循它,然后使用[object_selected conformsToProtocol:MyProtocol]安全地獲取如下屬性:

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

在單獨的.h文件中創建協議。 代碼看起來類似於以下內容:

@protocol NamedObjectProtocol

@property(nonatomic,strong)NSString * name;

@結束

然后,使兩個對象類聲明符合此協議。 然后,無論anObjectPerson還是Animal類的實例,都可以剪切if / else spaghetti並獲得這樣的屬性。

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

您還應該考慮使AnimalPerson類繼承自超類,該超類具有所有共性,例如name屬性。 這將允許您編寫如下代碼:

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

您可以使用鍵值編碼來安全地訪問該屬性。 只需使用:

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

這樣做的好處是,如果object_selected沒有名為name的屬性,應用程序不會崩潰,在這種情況下, name變量的值將為nil

另一種避免崩潰的方法是檢查對象是否響應選擇器,就像這樣

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

您可以只調用[object_selected name] ,但是您可能會收到name may not be a property (或類似name may not be a property編譯器警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM