我有一个采用NSDictionary arg的方法。这个NSDictionary有一些预定义的密钥。所有的obj都应该是字符串。但只有某些字符串obj对每个键都有效。 所以我的方法是为每个键的每个有效字符串输入defde NSString。我希望不要扩展NSString类。
我已经输入了一些NSString的...
typedef NSString MyStringType
然后我定义了几个......
MyStringType * const ValidString = @"aValidString";
以下是我在样本方法中要做的事情。
- (void)setAttrbiutes:(NSDictionary *)attributes {
NSArray *keys = [attributes allKeys];
for (NSString *key in keys) {
if ([key isEqualToString:@"ValidKey"]) {
id obj = [attributes objectForKey:key];
//Here's where I'd like to check..
if (**obj is MyStringType**) {
}
}
}
}
如果有更好的方法来解决NSDictionary的obj类型问题,我会接受其他想法。
答案 0 :(得分:2)
不能那样工作; typedef是一个编译时别名,不能通过字典传递。
在任何情况下,对这样的事情使用typedef都会很笨拙。
我建议您创建一个属性列表 - 无论是作为项目中的文件还是代码中的文件 - 包含各种键和有效值的规范,然后编写一个小的验证器,传递一个字符串和值,可以验证字符串值对的有效性。
这也使您可以灵活地扩展验证器。例如,您可能有一个@“持续时间”键,该键只能在1到20的范围内。
答案 1 :(得分:0)
除了为特殊值设置typedef
外,一种可能的选择是创建NSSet
特殊值。然后在您的代码中,您可以验证字典中的对象是否在您的集合中。
答案 2 :(得分:0)
NSString +相关对象的类别组合怎么样?
有些事情(未经测试!!):
@interface NSString (BBumSpecial)
- (NSString *) setSpecial: (BOOL) special ;
- (BOOL) special ;
@end
和
@implementation NSString (BBumSpecial)
static void * key ;
- (NSString *) setSpecial: (BOOL) special {
objc_setAssociatedObject(self, &key, special ? @YES : @NO, OBJC_ASSOCIATION_ASSIGN) ;
return self ;
}
- (BOOL) special {
id obj = objc_getAssociatedObject(self, &key) ;
return obj && [obj boolValue] ;
}
@end
然后您可以将其用作:
NSString * mySpecialString = [@"I'm Special" setSpecial:YES] ;