2012-03-23 34 views
2

在C#中我可以这样做:Objective-C中的“泛型”做一个RangeValidator?

class RangeValidator<T> { 
    public T MinValue { get; set; } 
    public T MaxValue { get; set; } 
} 

其中T可以是任何基本类型; int,float,double ...或任何“对象”类型; StringDateTime

如果OBJ - C的,我做了这样的:

@interface RangeValidator { 
    id minValue; 
    id maxValue; 
} 
@property ... 

它的工作对我们说的NSNumber或NSString的,但如果我分配了一个NSInteger的给我minValue(最小值)会得到像

warning: initialization makes pointer from integer without a cast 
// Since an id is a pointer to an object, not an integer. Correct? 

这里明显的解决方案可能是使用NSNumber代替。我只是好奇,是否有任何其他解决方案来解决这类问题?

谢谢!

回答

2

正确的方法是使用一个NSNumber和初始化从整数与

[NSNumber numberWithInt:someInt]; 

这样的类并不需要仿制药,你可以很容易地通过检查执行验证,如果minValuemaxValue例如理解intValue(或者一些比较选择器可能,取决于你想做什么)。

if([minValue respondsToSelector:@selector(intValue)]) { 
    return [minValue intValue]; 
} else { 
    .... 
} 
1

我认为,真正地道的Objective-C的解决方案将是正是你提出什么,可以使用id类型,并在NSNumber包裹原始数值。 NSInteger,如康斯坦丁提到,是一种最原始的 - 看到Foundation Data Type Reference

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 

原始类型和对象之间的这种矛盾是有点可惜,你要学会识别非对象类型,如NSIntegerCGRectCMTime

+0

谢谢zoul!我接受了你的Krumelur的建议去包装NSNumber。在这种情况下,你是否分享Konstantins认为非类型化代码('id minValue; id maxValue;')是丑陋的?我认为这就是obj-c ppl喜欢它的原因:) – Cotten 2012-03-23 15:10:03

+0

我喜欢尽可能保持精确的类型,但是在这里输入的文字很少,没有那么糟糕。当然,我更喜欢Objective-C++的'id'解决方案。 – zoul 2012-03-24 07:55:20

+0

好的,谢谢你的输入! – Cotten 2012-03-26 06:30:27

2

如果您想在Objective C中使用泛型,我建议您使用支持C++模板的Objective C++,而不是这种丑陋的非类型化代码。

上面的代码不起作用,因为NSInteger是适合原始类型的typedef,而不是指针类型。您应该使用NSNumber包装。

+0

比方说,我去的NSNumber包装建议...更多的客观C人认为上述无类型代码('ID minValue; ID的maxValue;')是**丑陋**?难道我必须进入Objective-C++吗? – Cotten 2012-03-23 14:48:19

+0

这取决于你认为丑陋的东西。我认为无类型语言是错误的,但其他人不这么认为:-) – 2012-03-23 17:08:33

+0

得到你。我的问题是,我懒得进入++现在:)但谢谢你的建议!这听起来像是值得在未来看看的东西。 – Cotten 2012-03-26 06:33:51