![](/img/trans.png)
[英]MVC in iOS: How to identify which model object corresponds to a touched view?
[英]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])];
簡而言之:您可以在協議中定義所需的所有屬性,使您的類(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;
@結束
然后,使兩個對象類聲明符合此協議。 然后,無論anObject
是Person
還是Animal
類的實例,都可以剪切if / else spaghetti並獲得這樣的屬性。
id <NamedObjectProtocol> namedObject = anObject;
NSString *name = namedObject.name;
您還應該考慮使Animal
和Person
類繼承自超類,該超類具有所有共性,例如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.