2013-07-27 41 views
1

我建立一個類XXTreeNode:如何在Obj-C中構建一個強類型容器?

@interface XXTreeNode : NSObject<XXSearching> 

@property XXTreeNode *parent; 
@property NSMutableArray *children; 
@property id data; // problem here 
@property(readonly) int count; 

-(XXTreeNode*)initWithData: (id)data; 
-(bool)addChild: (XXTreeNode*)child; 
-(bool)removeSelf; 
-(NSArray*)searchChildren: (id)content; // problem here 
-(XXTreeNode*)searchChildrenFirst: (id)content; // problem here 

@end 

我想這個類是通用的 - 我可以存儲任何類型的「數據」字段中。在C#中,我可以

class Node<T> 

容易做到這一點,然後我可以創建這樣的類與任何類型的我想:

Node<String> a = new Node<String>(); 
Node<int> b = new Node<int>(); 

但如何做這樣的事情在Objective-C?

順便說一句:我知道有一個'id'類型,你可以看到我已經聲明瞭我想作爲'id'泛型的字段,但'id'不適合簡單的類型,比如NSInteger或unichar。

回答

1

如果您在NSValue(對於結構體)或NSNumber(對於整型和浮點型)中將它們裝箱,則對於原始類型,id可以正常工作。我不得不建議不要使用Objective-C的泛型,它取決於宏,並使代碼混淆。

不幸的是,如果你使用簡單的id值,你不會得到類型檢查。但請記住,泛型(支持它們的語言中的真正泛型)可以被認爲只是一種自動生成針對特定類型定製的自定義子類的方法。你總是可以自己寫這些課程,例如

@interface IntNode : Node 
@property int intData; 
@end 

@interface Node (IntSearching) 
- (NSArray *)searchChildrenForInt:(int)anInt; 
-(XXTreeNode*)searchChildrenForFirstInt:(int)anInt; 
@end 

你可以實現它是這樣的:

@implementation IntNode 
- (int)intData { return [_data intValue]; } 
- (void)setIntData:(int)anInt { self.data = @(anInt); } 
@end 

@implementation Node (IntSearching) 
- (NSArray *)searchChildrenForInt:(int)anInt { 
    return [self searchChildren:@(anInt)]; 
} 
-(XXTreeNode*)searchChildrenForFirstInt:(int)anInt { 
    return [self searchChildrenFirst:@(anInt)]; 
} 
2

id的包裝不適合簡單的類型,如NSIntegerunichar

這就是NSValuedocs)和它的子類NSNumberdocs)已經被髮明瞭。

相關問題