【问题标题】:Macro for Objective CObjective C 的宏
【发布时间】:2023-03-27 15:24:02
【问题描述】:

我想编写一个宏来生成如下两种方法:

- (NSString*)propertyName
{
    NSString *key = @"PropertyName";

    //get value from NSUserDefaults
    //...
}
- (void)setPropertyName:(NSString*)value
{
    NSString *key = @"PropertyName";

    //set value to NSUserDefaults
    //...
}

get方法中属性名首字母小写,set方法和key值中大写。

宏应该接收 1 或 2 个参数,即属性名称:

MY_PROPERTY(propertyName)

或

MY_PROPERTY(PropertyName)

或

MY_PROPERTY(propertyName, PropertyName)

参数也是key 的值(字符串值)。

如何为此编写宏?我更喜欢第一个或第二个。谢谢。

【问题讨论】:

  • 为什么人们把这个问题记下来了? (在我写这篇文章时它是-3。我现在正在投票。对我来说似乎是一个公平的问题。)
  • 为什么要这样的宏?你的 setter 没有设置任何东西,你的 getter 很短,像往常一样写起来更容易。而且以后支持起来更容易。顺便说一句,您的 getter 也不会返回任何内容 :) 宏只会将 MY_PROPERTY 替换为某些内容,您将无法编辑 ...s。可能你的意思是sn-p? (P.S. 我没有对你投反对票)
  • @BergQuester + FreeNick 请注意,如果您想要在 ... 中保持不变,这将非常有用。例如,如果您有一个 PreferencesManager 并且您想从 NSUserDefaults 设置和获取属性,那么宏会非常好
  • 我的应用有很多设置保存在NSUserDefaults。我希望每个设置都有自己的 getter/setter。我不想到处复制那个代码。问题是我不知道如何: - 传递参数并更改其首字母大小写。 - 在 setter 中的名称前添加单词 set。 - 将属性名称放在这样的字符串中:@"PropertyName"。这就是为什么您在代码中看到...,它与问题无关。
  • @Arnol — 您可能需要编辑您的问题以添加一些背景来解释目的(例如,NSUserDefaults),因为它可以帮助我们更好地了解您的动机。正如我所怀疑的,你的动机似乎是有根据的。 :)

标签: objective-c xcode macros


【解决方案1】:

让我们生气吧:

#define STRINGIFY(__TEXT__) [NSString stringWithFormat:@"%s", (#__TEXT__)]

#define GENERATE_GETTER_AND_SETTER(__UPPER_CASE__, __LOWER_CASE__, __TYPE__) \
    - (void)set##__UPPER_CASE__:(__TYPE__)__LOWER_CASE__ { \
        NSString *propertyName = STRINGIFY(__UPPER_CASE__); \
       \ 
       ...
    } \
    \
    - (__TYPE__)__LOWER_CASE__ { \
        NSString *propertyName = STRINGIFY(__UPPER_CASE__); \
       \ 
       ...
        return ... \
    } \

用法:

GENERATE_GETTER_AND_SETTER(MyProperty, myProperty, NSArray*)

请注意,您必须同时指定小写和大写名称,并且您必须知道属性的类型。

将属性声明为@dynamic,然后动态实现方法可能更容易,有关详细信息,请参阅Objective-C forwardInvocation:。

【讨论】:

  • xcode 无论如何都会生成 getter 和 setter,所以.. 为什么?
  • @Daij-Djan 别问我。我希望他想在其中做一些其他的动作,例如将它们重定向到字典而不是 ivars。对我来说,这只是一个有趣的宏练习:)
  • @Daij-Djan - 从问题中的代码来看,目的是将NSUserDefaults 包装为属性。
  • 这就是我投了赞成票的原因——尽管我同意应避免使用宏的已删除“答案”:qualitycoding.org/preprocessor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多