Objective c 如何在Obj-C中构建强类型容器?
我正在建造一个XXTreeNode类: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
@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)];
}