【问题标题】:Change #define argument更改#define 参数
【发布时间】:2013-06-05 15:32:16
【问题描述】:

我为 getter 方法编写了预处理器定义语句

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

但是在对 setter 方法执行相同操作时卡住了,因为我必须将 propertyName 参数修改为 setPropertyName。

有没有办法进行这种参数修改。

编辑 我应该说这两个定义都应该覆盖编译器生成的 getter/setter 方法。 但如果我猜对了马蒂亚斯,唯一的办法就是像这样提供所讨论财产的大写版本。

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

【问题讨论】:

  • 如果您编辑问题中的代码,请以实际可行的方式进行。您不能像这样将#defines 放在多行上

标签: ios preprocessor


【解决方案1】:

您可以使用## 将两个标记连接在一起。但是预处理器不能改变令牌的大小写。所以你必须自己提供一个大写的属性名称。

这样的东西应该可以工作

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

而且由于预处理器无法更改为大写,因此您必须提供首字母大写的属性名称

SetNSStringDefaultForPropertyWithNameAndKey(Foobar, @"foobar")

GetNSStringDefaultForPropertyWithNameAndKey(foobar, @"foobar")

【讨论】:

  • 刚刚定义了一个前提条件,因此 propertyNameKey 必须是 propertyName 的首字母大写版本,这样我就可以同时使用了。谢谢。
猜你喜欢
  • 2019-06-03
  • 2019-11-27
  • 2013-11-17
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
相关资源
最近更新 更多