Objective c 如何在Obj-C中构建强类型容器?

Objective c 如何在Obj-C中构建强类型容器?,objective-c,Objective C,我正在建造一个XXTreeNode类: @interface XXTreeNode : NSObject<XXSearching> @property XXTreeNode *parent; @property NSMutableArray *children; @property id data; // problem here @property(readonly) int count; -(XXTreeNode*)initWithData: (id)data; -(boo

我正在建造一个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这样的简单类型。

托默·雪莉(Tomer Shiri)就是在几周前创建的,所以它还是很新的,可能值得


如果你想存储数字,你需要使用一个数字数据类型的包装器

Tomer Shiri就是在几周前创建的,所以它还是很新的,可能是值得的

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

但id不适合于NSInteger或unichar这样的简单类型

这就是NSValue及其NSNumber子类被发明的目的

但id不适合于NSInteger或unichar这样的简单类型


这就是NSValue及其NSNumber子类被发明的目的。

id适用于基本类型,如果将它们框在NSValue中表示结构,或将它们框在NSNumber中表示整型和浮点型。我不得不建议不要使用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)];
}

对于基本类型,如果您将它们放入结构的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)];
}