在C#中,我可以这样做:
class RangeValidator<T> {
public T MinValue { get; set; }
public T MaxValue { get; set; }
}
其中T可以是任何原始类型; int
,float
,double
...或任何“对象”类型; String
,DateTime
等。
如果在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。如果有任何其他解决方案可以解决这类问题,我只是好奇吗?
谢谢!
答案 0 :(得分:2)
正确的方法是使用NSNumber
并使用
[NSNumber numberWithInt:someInt];
这样,该类不需要泛型,您可以通过检查minValue
和maxValue
是否可以轻松执行验证。理解intValue
(或某些比较选择器可能,取决于你想做什么)。
if([minValue respondsToSelector:@selector(intValue)]) {
return [minValue intValue];
} else {
....
}
答案 1 :(得分:2)
如果你想在Objective C中使用泛型,我建议你使用支持C ++模板的Objective C ++而不是这个丑陋的无类型代码。
上面的代码不起作用,因为NSInteger是适当原始类型的typedef而不是指针类型。您应该使用NSNumber包装器。
答案 2 :(得分: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
原始类型和对象之间的这种不一致有点不幸,您必须学会识别非NSInteger
,CGRect
或CMTime
等非对象类型。