【问题标题】:Print string representation of an enum, NSLog打印枚举的字符串表示,NSLog
【发布时间】:2023-03-10 12:14:01
【问题描述】:

我正在尝试 NSLog 我拥有的一些枚举。例如,这段代码打印枚举的整数表示,但我希望它输出实际的字符串名称,在本例中为 MON。我该怎么做?

#import <Foundation/Foundation.h>
int main(void)
{
    typedef enum {
        SUN,
        MON,
        TUES
    } DAYS;

  DAYS d = MON;
  NSLog(@"%@", d);
  return 0;
}

【问题讨论】:

    标签: objective-c enums


    【解决方案1】:

    LLDB 调试器将显示字符串标识符。因此,您可以使用带有调试器命令操作的断点(在您的情况下为“p d”)而不是使用 NSLog,并将断点设置为在评估后自动继续。

    您可以通过右键单击蓝色标记来配置断点。

    【讨论】:

    • 对我来说是 p/d;即p/d textField.autocorrectionType。但简单的print 而不是p/d 实际上也是如此
    【解决方案2】:

    不容易。枚举值的字符串标识符供开发人员使用,但在内部它只是一个具有特定类型的值(在您的示例中,DAYS)。

    你可以写一个翻译方法,返回枚举值的名称,例如

    - (NSString*)nameForDay:(DAYS)day {
        switch (day) {
            case SUN:
                return @"SUN";
            break;
            case MON:
                return @"MON";
            break;
            case TUES:
                return @"TUES";
            break;
            default:
                return nil;
            break;
        };
    
        return nil;
    }
    

    这是一种令人讨厌的做法,因为它不能完全适应枚举值的变化,但它是一种将字符串与枚举值相关联的方法。

    【讨论】:

    • 就像 WDUK 所说的那样,它不能真正以真正明智的方式完成。原因是编译器实际上用值替换了这些枚举名称,因此它们甚至在运行时都不可用。像 WDUK 这样的解决方案当然可以,但也许您应该考虑使用不同的模型来实现您想要的?
    • 如果这个答案适合您的需要,您能接受吗?谢谢
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多