2012-08-04 65 views
2

我正在開發一個應用程序,其中有兩個非常相似的模型類。我想在一個視圖控制器中使用這兩個類,該佈局基於模型類的屬性。問題是我目前有很多if語句來檢查它是哪個類。如何創建兩個模型類的包裝類在objective-c

例子:

- (UIView *)setUpViewForObject:(id)object 
{ 

    // Check if it is a Post or Event object 
    Post *post; 
    Event *event; 
    if ([object class] == [Event class]) { 
     event = (id)object; 
    } else if ([object class] == [Post class]) { 
     post = (id)object; 
    } 

    if (post) { 
     // Do stuff 
     // ie: 
     self.customUiView.textField.text = post.text; 
    } else if (event) { 
     // Do similar stuff 
     // ie: 
     self.customUiView.textField.text = event.text; 
    } 
} 

該解決方案似乎相當多餘的,我這樣做是在幾個地方。因此我想知道是否可以創建兩個NSManagedObject類的包裝類。我使用CoreData並從xCode生成模型,因此我不會使用所有這些if語句。

喜歡的東西:

@interface News : NSManagedObject 
[...] 
@property (nonatomic, retain) NSString * text; 
[...] 

@interface Event : NSManagedObject 
[...] 
@property (nonatomic, retain) NSString * text; 
[...] 

是否有可能創建一個包裝類這兩個NSManagedObject類的,可能與枚舉。我也希望這些對象是可更新的,可刪除的等等。想到我可能可以使用Enum或類似的東西來創建一個抽象類,但是我不知道這樣的類會如何工作和使用。

任何建議,如果這是可能的,在這種情況下這樣的包裝類會看起來將不勝感激。

+0

'如果([對象​​類別] == [事件類])'是危險的,請使用'[object isKindOfClass:[Event class]]'代替。 – 2012-08-04 13:17:45

回答

1

核心數據支持抽象超類的概念。所以你用一個屬性來定義它,比如說「標籤」,它可以區分這兩個類。然後,新聞和事件都將該類作爲他們的超類。這是Core Data使用的一種非常常見的解決方案。

+0

謝謝,抽象超類應該擁有所有的共性還是隻有一個? – Anders 2012-08-05 12:08:27

+0

您可以添加所需的所有常用屬性。我們使用這種技術,就像您在教科書中讀到的一樣 - 「動物」基類,然後是特定的子類等等。然後你可以在設置一個屬性之前總是用抽象超類來測試一個對象「isKindOfClass:」。 – 2012-08-05 13:24:05

+0

很酷,如何使用if語句在我的原始問題中發佈代碼示例。我可以做@ bogdan-andresyuk在他的回答中寫道,還是會以不同的方式工作?我現在的清潔工的模型非常棒!但如果我不需要所有這些if語句,它會更好。謝謝! – Anders 2012-08-05 15:27:17

1

嘗試這樣做:

//in NewsEventRootObject.h 
@interface NewsEventRootObject:NSManagedObject //root object for these two classes 

[...] 

@property (nonatomic,retain) NSString *text; //similar fields in here 

-(void) getSomeValue; 

//in News.h 
@interface News : NewsEventRootObject 

[...] 

-(void) getNews; 

//in Event.h 
@interface Event : NewsEventRootObject 

[...] 

-(void) getEvent; 

//in your "handler".m 

- (UIView *)setUpViewForObject:(NewsEventRootObject *) object 
{ 
    //you can access similar fields and methods without if/else statements 
    self.customUiView.textField.text = object.text; 

    SomeValue *someValue=[object getSomeValue]; 

    //but for class-specific you should make a check 
    if ([object respondsToSelector:@selector(getEvent)]) { 

    } 

    if ([object respondsToSelector:@selector(getNews)]) { 

    } 

} 

真的,從來沒有通過==檢查類,使用isKindOfClass聲明

+0

這並不理想。它保留了「switch語句/如果邏輯是多態性」反模式,通常意味着多態性將是更好的解決方案。 – occulus 2012-08-04 14:12:24

+0

如果模型非常相似(如主題中所述)並且Anders不使用類特定的方法和變量,這是一個理想的解決方案。 – 2012-08-04 14:57:21

+0

謝謝,很難選擇誰給出正確的答案。你的建議也非常接近我最後提出的建議。 – Anders 2012-08-06 08:58:47