2013-07-25 47 views
1

在我的項目中,我從一個定製SDK中傳遞了一個數據對象(XYZCustomClass)。我將永遠不需要修改這個對象,只使用它並在UI中呈現它的數據。 此自定義數據對象具有5個正常字符串屬性和一個名爲「addditionalProperties」的NSDictionary類型屬性。該字典包含一組鍵值對。通過類別從鍵中獲取其他只讀屬性

我想在我的客戶端部分,是在我的自定義數據對象上具有與這些鍵匹配的真實屬性。基本上我想要有一個不錯的界面,所有的東西都是一個真正的財產。我不想在鍵下隱藏一些東西,而其他的東西可以正常使用。

我要創建這個數據對象的類別,將針對每一個琴鍵 宣佈2 1 )公共只讀屬性)實現,將檢索該是相關的特定屬性的特定鍵的對象的干將。

在4.6.3 Xcode上工作。基礎SDK是5.0。我的方法好嗎?它會起作用嗎?

請記住,它們是隻讀的,所以請不要有關聯的對象建議。

回答

0

如果你簡單的聲明方法,你可以得到DOT糖語法。該類別的.h文件,像這樣:

@interface CustomDataObject (additionalProperties) 

-(NSString *)amount; 

@end 

然後,您可以:

NSLog(@"%@", myObject.amount); 

如果你不想申報的方法爲每個可能是你可以做一些像字典裏元素:

@interface CustomDataObject (additionalProperties) 

-(NSString *)additionalPropertiesKey:(NSString *)key; 

@end 

但是你會失去DOT語法,因爲在這種情況下該方法需要一個參數。

0

不,你不能在類別中聲明屬性。 但是,您可以使用解決方法,如果屬性不是隻讀的,則可以添加方法,這將與訪問方法一樣工作:

例如,

//getter 
-(obj *)readVal{ 

return self._obj; 
} 

//setter 
-(void) update :(obj *)_val{ 
self._obj=_val; 
} 

您可以使用關聯引用。從蘋果的文檔引用「可以直接與這個運行時系統交互,比如通過向對象添加關聯引用。與類擴展不同,關聯的引用不會影響原始類的聲明和實現,這意味着您可以將它們用於框架類您無法訪問原始源代碼。「 。

有關說明,請參閱該SO answer

+0

原因是類別增加了對象的重要性,但它不會覆蓋alloc,i。即沒有辦法爲新的房產分配更多的空間。 – Paul

+0

即使它被顯式設置爲只讀,並且getter從基於鍵的現有數組獲取對象,並且該數組仍然在原始類中? 我不會合成任何東西..只聲明只讀屬性的接口和實現中的getter方法。 –

+0

我試了一下,它的工作原理。我對此感到有些不安:(很明顯,雙方都是錯的,它是Xcode還是你? –

0

這個工作沒有明顯的問題。這段代碼是否有一些內容?

數據對象

#import <Foundation/Foundation.h> 

@interface CustomDataObject : NSObject 

@property (strong, nonatomic) NSString *name; 
@property (strong, nonatomic) NSDictionary *additionalProperties; 

@end 

#import "CustomDataObject.h" 

@implementation CustomDataObject 

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.name = @"FirstName LastName"; 

     self.additionalProperties = @{@"amount" : @"1000", 
             @"state" : @"happy"}; 
    } 
    return self; 
} 

@end 

CATEGORY

#import "CustomDataObject.h" 

@interface CustomDataObject (additionalProperties) 

@property (assign, nonatomic, readonly) NSString *amount; 
@property (assign, nonatomic, readonly) NSString *state; 

@end 

#import "CustomDataObject+additionalProperties.h" 

@implementation CustomDataObject (additionalProperties) 

-(NSString *)amount 
{ 
    return [self.additionalProperties objectForKey:@"amount"]; 
} 

-(NSString *)state 
{ 
    return [self.additionalProperties objectForKey:@"state"]; 
} 

@end 

的ViewController和輸出

CustomDataObject *myObject = [[CustomDataObject alloc] init]; 

NSLog(@"%@", myObject.name); 
NSLog(@"%@", myObject.amount); 
NSLog(@"%@", myObject.state); 

----- 

2013-07-25 15:44:01.790 CatTest[30911:c07] FirstName LastName 
2013-07-25 15:44:03.487 CatTest[30911:c07] 1000 
2013-07-25 15:44:03.984 CatTest[30911:c07] happy