1

ほとんど同じことを行う一連のメソッドを含む実装があります。

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

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

これらのゲッターを次のように便利に使用できるようになりました。

NSString *foo = [Setting sharedInstance].specialKey;

ディクショナリで検索する文字列は常にゲッターの名前になるため、これでプロパティを定義し、これらすべてのケースに対して1 つのdynamic実装を作成できるはずです。これは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 に答える