1

我有一个实现,其中包含一组几乎相同的方法:

- (NSString *) specialKey{
  [self.mySpecialDictionary valueForKey:@"specialKey"];
}

- (NSString *) anotherKey{
  [self.mySpecialDictionary valueForKey:@"mySpecialKey1"];
}

我现在可以像这样方便地使用这些吸气剂:

NSString *foo = [Setting sharedInstance].specialKey;

我想我现在应该能够定义我的属性dynamic并针对所有这些情况进行一种实现,因为我在字典中查找的字符串将始终是 getter 的名称。我很确定这在 Objective-C 中应该是可行的,但我不知道如何实现这一点。

4

2 回答 2

1

答案就在你的问题中。尝试方法转发:

- (NSMethodSignature*) methodSignatureForSelector:(SEL)selector
{
    return [mySpecialDictionary methodSignatureForSelector:@selector(valueForKey:)];
}

- (void) forwardInvocation:(NSInvocation *)invocation
{
    NSString* propertyName = NSStringFromSelector(invocation.selector);
    [invocation setSelector:@selector(valueForKey:)];
    [invocation setArgument:&propertyName atIndex:2];
    [invocation invokeWithTarget:mySpecialDictionary];
}

当然,要摆脱编译器警告,它需要显式定义每个属性

@property (nonatomic, readonly) NSString* specialKey;
@property (nonatomic, readonly) NSString* anotherKey;

@dynamic为他们提供。

于 2012-05-06T22:34:03.823 回答
0

那这个呢?

   - (NSString *)valueForKey:(NSString *)key
   {
        return [self.mySpecialDictionary valueForKey:key];
   }

这将返回所提供键的值。或者这个更灵活的使用

- (NSString *)valueForKey:(id)key 
{
    if([key isKindOfClass:[NSString class]]){
            return [self.mySpecialDictionary valueForKey:key];
    }
}

甚至这个

 - (id)valueForKey:(id)key 
    {
        if([key isKindOfClass:[NSString class]]){
                return [self.mySpecialDictionary valueForKey:key];
        } else if (..){
               // catch more possible keys here ...
        }
    }
于 2012-05-06T21:53:37.763 回答