0

getter メソッドのプリプロセッサ定義ステートメントを作成しました

#define GetNSStringDefaultForPropertyWithNameAndKey(propertyName, propertyKey) - (NSString *)propertyName { return [[NSUserDefaults standardUserDefaults] objectForKey:_userDefaultsKey][propertyKey];  }

しかし、setPropertyName に propertyName 引数を変更する必要があるため、setter メソッドに対して同じことを行うと行き詰まりました。

この種の引数の変更を行う方法はありますか。

編集私は、両方の定義がコンパイラによって生成された getter/setter メソッドを上書きする必要があると言うべきでした。しかし、Matthias が正しければ、唯一の方法は、問題のプロパティの大文字バージョンをそのように提供することです。

#define SetNSStringDefaultForPropertyWithNameAndKey(PropertyName, propertyKey) - (void)set  ## PropertyName:(NSString *)newValue \  
{ \  
    self.userDefaults[propertyKey] = newValue; \
    [self updateUserDefaults]; \
} \
4

1 に答える 1

1

を使用##して、2 つのトークンを連結できます。ただし、プリプロセッサはトークンの大文字と小文字を変更できません。そのため、大文字のプロパティ名を自分で指定する必要があります。

このようなものが動作するはずです

#define SetNSStringDefaultForPropertyWithNameAndKey(propertyName, propertyKey) - (void)set ## propertyName:(id)object { [[NSUserDefaults standardUserDefaults] objectForKey: _userDefaultsKey][propertyKey] = object; }

また、プリプロセッサは大文字に変更できないため、プロパティ名の最初の文字を大文字にする必要があります

SetNSStringDefaultForPropertyWithNameAndKey(Foobar, @"foobar")

GetNSStringDefaultForPropertyWithNameAndKey(foobar, @"foobar")
于 2013-06-05T06:55:23.780 に答える