1

我有一个采用 NSDictionary arg 的方法。这个 NSDictionary 有一些预定义的键。所有的 obj 都应该是字符串。但只有某些字符串 obj 对每个键有效。所以我的方法是为每个键的每个有效字符串 typedef NSString。我希望不要扩展 NSString 类。

我已经 typedef 了一些 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 类型问题,我愿意接受其他想法。

4

3 回答 3

2

不是那样工作的;typedefs 是编译时别名,无法通过字典传递。

在任何情况下,使用 typedef 来处理这样的事情都会很笨拙。

我建议您创建一个属性列表 - 作为项目中的文件或代码中的文件 - 包含各种键和有效值的规范,然后编写一个小验证器,传递一个字符串和值,可以验证字符串有效性的值对。

这也使您可以灵活地在将来扩展您的验证器。例如,您可能有一个只能在 1 到 20 范围内的 @"Duration" 键。

于 2013-05-05T00:10:51.743 回答
0

typedef一种可能的选择是创建一个特殊值,而不是为您设置一个NSSet特殊值。然后在您的代码中,您可以验证字典中的对象是否在您的集合中。

于 2013-05-05T00:11:24.433 回答
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] ;

?

于 2013-05-05T00:56:43.093 回答