如何检查Objective-c NSDictionary中的typedef'dobj

时间:2013-05-05 00:06:07

标签: objective-c nsdictionary

我有一个采用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类型问题,我会接受其他想法。

3 个答案:

答案 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] ;