1

我正在构建一个类 XXTreeNode:

@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 这样的简单类型。

4

3 回答 3

2

id不适用于像NSIntegeror之类的简单类型unichar

这就是NSValue( docs ) 及其NSNumber子类 ( docs ) 的发明目的。

于 2013-07-27T17:45:00.580 回答
1

Tomer Shiri 正是在几周前创造了这个,所以它仍然很新,可能值得一。(https://github.com/tomersh/Objective-C-Generics

如果要存储数字,则需要使用NSNumber,它是数字数据类型的包装器

于 2013-07-27T17:43:17.983 回答
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)];
}
于 2013-07-27T17:52:57.120 回答