【问题标题】:How to serialise ObjC enums in JSON?如何在 JSON 中序列化 ObjC 枚举?
【发布时间】:2023-04-05 20:00:01
【问题描述】:

我想将我的应用的皮肤设置存储在一个 json 文件中。我将如何存储颜色/样式等的枚举值,然后将它们从字符串中转换回来?我将如何存储 MKPinAnnotationColorRed 或 UITableViewStyleGrouped?

如果只是存储等效的整数,我可以接受,而不是实际存储枚举字符串值。

【问题讨论】:

    标签: ios objective-c json


    【解决方案1】:

    “我想将我的应用程序皮肤设置存储在一个 json 文件中” - 这是 iPhone 上的错误方法。操作系统提供了NSUserDefaults 类,为您处理所有细节。

    例如,存储一个枚举值(实际上是整数值):

    [[NSUserDefaults standardUserDefaults] setInteger: annotationColor
        forKey: @"SomeKey"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    您还可以轻松存储和检索序列化对象或本机类型(数组、字典、数字、字符串)。

    【讨论】:

    • 好的,所以我的解释有点薄,我将它存储在 json 中的原因是皮肤实际上是通过 web 服务定义的
    • 我的问题是如何将其退回?
    【解决方案2】:

    简短的回答是,你不能。

    除非你做以下几件事之一:

    1. 将枚举的整数值存储在 json 文件中。 (这是您的“如果它只是存储等效整数的问题,而不是实际存储枚举字符串值”,这似乎是最简单,最好的解决方案)。
    2. 将单独的枚举值数组保存为字符串,并与它们进行比较并返回正确条目的索引。
    3. 不要使用枚举,而是使用字符串常量。
    4. 使用可以解析为整数或字符串的四字符常量代替枚举。

    【讨论】:

      【解决方案3】:

      您必须在枚举和字符串之间创建一些显式映射。一种方法如下:

      #define ENTRY(x) [NSNumber numberWithInt:x], @#x
      
      NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
          ENTRY(enumOne),
          ENTRY(enumTwo),
          ENTRY(enumThree),
          nil];
      
      #undef ENTRY
      
      NSNumber* index = [dict objectForKey:@"enumOne"]);
      

      请注意,这是通用方法,如果您有等距的枚举值,则不必存储它们的数值并且可以使用例如NSArray 代替。

      【讨论】:

        猜你喜欢
        • 2023-02-22
        • 2012-05-26
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多