2013-06-05 76 views
0

我寫了一個預處理定義語句getter方法變化的#define參數

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

但做同樣的setter方法時卡住了,因爲我不得不修改propertyName的參數setPropertyName方法。

是否有辦法做這種參數修改。

編輯 我應該說這兩個定義都應該覆蓋編譯器生成的getter/setter方法。 但是,如果我得到了Matthias的權利,唯一的辦法就是提供像這樣的財產的大寫版本。

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

如果您在編輯代碼該問題請以實際工作的方式進行。你不能像這樣在多行上放置#define –

回答

1

您可以使用##連接兩個標記在一起。但是,預處理器不能更改令牌的情況。所以你必須自己提供一個大寫的屬性名稱。

像這樣的東西應該工作

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

而且,由於預處理器不能更改爲大寫,你必須提供屬性名稱的第一個字母大寫

SetNSStringDefaultForPropertyWithNameAndKey(Foobar, @"foobar") 

GetNSStringDefaultForPropertyWithNameAndKey(foobar, @"foobar") 
+0

剛剛做了一個前提條件的定義,以便propertyNameKey必須是propertyName的第一個字符的大寫版本,這樣我纔有可用的。謝謝。 –