2012-10-18 32 views
0

假設我有一個簡單的DTO類是這樣的:在Obj-C中創建POCO對象的只讀版本?

@interface MYNugget 
@property (nonatomic, copy) NSString *color; 
@end 

@implementation MYNugget 
// automatic @synthesize 
@end 

然後我以後要在另一個類此對象存儲的方式,使得它是不可修改的(也就是說,使color財產只讀通過- (void)freeze什麼的。

什麼是實現這個短寫我自己制定者的最佳方法是什麼?

回答

5

的標準方式是個人有T o類,一個是可變的,一個是不可變的。

@interface MYNugget 
@property (nonatomic, copy, readonly) NSString *color; 
@end 

@interface MYMutableNugget : MYNugget 
@property (nonatomic, copy, readwrite) NSString *color; 
@end 

你的其他類將只露出MYNugget財產,最好再爲copy。這就是我們一直以NSString的方式來完成的。

+0

這是一個很好的解決方案。 – rckoenes

+0

所以只有'MYMutableNugget'類才能讓setters定義好嗎?這是否也適用於自動@synthesize? – chakrit

+0

是的,這應該工作得很好 - 它真的與我們一起工作的「標準」類相匹配。如果你想讓你的課程*很棒*,實施NSCopying協議(相當簡單)。 – Eiko

0

我會做的,僅通過構造函數設置顏色:

@interface MYNugget 
@property (nonatomic, copy, readonly) NSString *color; 

- (id) initWithColor:(NSString *)color; 

@end 

@implementation MYNugget 

@synthesize color = _color; 

- (id) initWithColor:(NSString *)color { 
    self = [super init]; 

    if (self) { 
    _color = [color copy]; 
    } 

    return self; 
} 

@end 
+0

這是一個很好的方法,但對於擁有多個屬性的課程來說,它並不能很好地擴展。 – chakrit

+0

是的,這是正確的,我認爲由Eiko的解決方案是一個將滿足您的需求,如果你喜歡多味的屬性/ – rckoenes