【问题标题】:Change enum values at runtime?在运行时更改枚举值?
【发布时间】:2012-05-05 12:38:34
【问题描述】:

有没有办法在目标 c 的运行时为枚举分配值? 我有几个枚举,并希望每个枚举都有一定的价值。 这些值可以从 xml 文件中读取。有没有办法做到这一点?

【问题讨论】:

    标签: objective-c ios enums objective-c-runtime


    【解决方案1】:

    不幸的是,@Binyamin 是正确的,你不能用枚举来做到这一点。出于这个原因,我通常在我的项目中执行以下操作:

    // in .h
    typedef int MyEnum;
    
    struct {
        MyEnum value1;
        MyEnum value2;
        MyEnum value3;
    } MyEnumValues;
    
    // in .m
    __attribute__((constructor))
    static void initMyEnum()
    {
        MyEnumValues.value1 = 10;
        MyEnumValues.value2 = 75;
        MyEnumValues.value3 = 46;
    }
    

    这还具有能够遍历值的优点,这对于普通枚举是不可能的:

    int count = sizeof(MyEnumValues) / sizeof(MyEnum);
    MyEnum *values = (MyEnum *) &MyEnumValues;
    
    for (int i = 0; i < count; i++)
    {
        printf("Value %i is: %i\n", i, values[i]);
    }
    

    总而言之,这是我在 C 中进行枚举的首选方式。

    【讨论】:

    • @Richard..你能解释一下什么是__attribute__((constructor))..谢谢你的回答
    • @learningDroid 它是一个 GCC 扩展,它允许您创建一个在目标加载之前调用的函数(在 dylib 中,它将在运行 dylib 的第一个函数之前,在应用程序,它就在main() 之前)。一个非常有用的结构,只要你不做繁重的工作,你应该没问题。
    • 我打算读取一个 xml 文件并将值分配给结构中的枚举。你觉得这在__attribute方法中会不会太重了
    • @learningDroid 没有,只​​要代码运行时间少于 5 秒。在这种情况下,操作系统将终止应用程序。
    • @Luda 在你的 .h 文件中移除 struct 关键字之前的关键字 typedef
    【解决方案2】:

    不,枚举信息在编译时被删除。

    【讨论】:

    • 不幸的是,情况就是这样。但是,如果您想保存信息,可以使用结构而不是枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多