2011-07-25 74 views
0

我有一個類主題和集團這兩者有一個叫做「名」的變量,所以我想這兩個如果語句合併成一條:動態目標C結合

if ([((RKMappableObjectTableItem *) _item).object isKindOfClass:[Group class]]){ 
     Group * group = (Group *)(((RKMappableObjectTableItem *) self.object).object); 
     //blah 
    } else if ([((RKMappableObjectTableItem *) _item).object isKindOfClass:[Topic class]]){ 
     Topic * topic = (Topic *)(((RKMappableObjectTableItem *) self.object).object); 
     //blah 
    } 

我試圖

id group = (((RKMappableObjectTableItem *) self.object).object); 

但是當我試圖group.name,它給了我:在ID類型的對象沒有找到

屬性名

+1

唉..的另一個受害者「點語法是最相同的,消息發送,除非,當-IT-isn't」 ...... –

+1

有針對性的設計決定仔細考慮具有很大程度上幫助了代碼質量在這種情況下,真正的問題是缺少抽象基類,或者不太適合使用協議。依靠(id)或類型轉換導致易碎,錯誤的代碼。真正的問題是不斷需要使用屬性的點語法,反之亦然。 – bbum

+0

相信我,如果我可以通過抽象基類來做到這一點..我會這樣做,而不是像這樣髒。這是一個很長的故事,爲什麼我不能在這裏抽象,與我正在使用的框架有關 – adit

回答

2

在Objective -C,屬性在編譯時經受更嚴格的類型檢查。

你可能也想嘗試:

[group name]; 

你在這種情況下,做的是不使用屬性機制和發送消息的對象。這使您可以充分利用Objective-C的動態特性。

在這種情況下,您將收到警告,但如果您能忍受,它應該可以正常工作。

+3

它給了什麼警告?只要你已經導入了一個標題,該標題用該選擇器和正確的簽名聲明瞭一個方法,它就不應該給出任何警告。 – Chuck

0

編譯器是正確的,group不是有一個屬性叫做namegroup類型爲id而不是TopicGroup

三個選項:

  1. 投它
  2. 避免使用點符號:[group name]
  3. 有常見的兩種TopicGroup一個基類,有name財產
+0

我不確定我是否同意這種描述事物的方式。無論其類型如何,該變量都沒有屬性。你不能有一個'Topic'或'Group'類型的變量 - 只有指針。我認爲說變量沒有足夠的信息來確定對象的屬性更準確。 – Chuck

1

您可以使用選擇器在對象上調用該方法之前測試某個對象是否實現了方法。

SEL method = @selector(name:); 
id groupOrTopic = [((RKMappableObjectTableItem *) self.object) object]; 

if ([groupOrTopic respondsToSelector:method]) 
    [groupOrTopic name]; 

我會建議不要使用這兩種對象的基類,我會建議定義的協議,並同時具有這些對象的實現該協議,如果你選擇了這條路。

@protocol SomeProtocol 
    -(NSString*)name; 
@end 
+0

使用協議是可行的,但與僅聲明主題和組繼承的抽象基類相比,這有點複雜。 – bbum