代码之家  ›  专栏  ›  技术社区  ›  mistahenry

泛型类型JSON模型

  •  0
  • mistahenry  · 技术社区  · 9 年前

    这个问题可能很简单,也可能很难。我真的不知道Objective-C是一种语言,但无论如何我都在尝试构建一个iPhone应用程序。我看着 JSON Model 作为一个潜在的自动魔法数据绑定库,用于将JSON对象转换为我的域模型。

    这是我的问题。我有一个纯RESTful的API,它返回具有与以下类似的公共顶级对象的资源:

    {
        "successMessages": [],
        "errorMessages": [],
        "data": {}
    }
    

    在Java/Govovy中,我使用类似于Jackson的库来实现这种绑定功能,并将编写一个类:

    public class ResponseWrapper<T>{
        Collection successMessages
        Collection errorMessages
        T data
    }
    

    这样 ResponseWrapper<MyObject> 将能够自动绑定JSON中的任何内容 data 属性设置为类型的对象 MyObject 。我还为所有集合使用了一个通用的集合包装器,该包装器保存了如何分页的信息,如果我能在一些帮助下找到它,我希望使用相同的模式!Objective-C支持这种泛型编程吗?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Amin Negm-Awad    9 年前

    首先:这很简单 错误的 Objective-C没有泛型。这个城市传说的原因是大多数开发人员不知道泛型是什么。泛型是类型无关的代码。时期这就是定义。Java、Swift、C++等静态类型语言需要一种特殊的语法,以使编译器在编译时知道代码的具体类型。因此,它们只支持从编辑到编译的泛型。在动态类型语言中,您不需要任何额外的$,因为泛型是内置的,从编辑到运行时都是免费的。这功能更强大,语言复杂性更低。

    致您的问题:

    在Objective-C中,您可以像创建类一样简单地创建类,而不考虑JSON传输。你不必担心这个。一、 e.结果如下:

    @interface ModelClass : NSObject
    @property NSArray *successMessages;
    @property NSArray *errorMessages;
    @property AnotherClass data; // If you do not want to have concrete types here, use id
    @end
    

    要填充属性,可以使用框架。但这不是必须的。(我会对JSON模型发表一些评论,但这不是问题的主题。)

    要实现这一点,只需获取字典(JSON对象)并从中创建一个实例:

    @implementation NSObject (JSONToInstance)
    - (id)initFromJSON:(NSDictionary*)JSON dataTypes:(NSDictionary*)types
    {
      self = [super init];
      if (self)
      {
        for( NSString *key in JSON )
        {
          id value = JSON[key];
          NSDictionary *types = types[key];
          Class type = NSClassFromString(key);
          if (types)
          {
            id value = [[type alloc] initWithJSON:value dataType:types];
          }
          [self setValue:value forKey:key];
        }
      }
      return self;
    }
    @end
    

    要使用它:

    …
    NSDictionary *JSON = …;
    // Model refers to person and person has no "generic object" at all.
    ModelClass *model = [[ModelClass alloc] initWithJSON:JSON dataTypes:@{ @"Person" : @()];
    

    在Safari中键入。

    当然,你可以使用图书馆。(我个人更希望尽可能具体,即使这意味着要有更具体的代码。但我是一名开发人员,而不是秘书。)

        2
  •  1
  •   drekka    9 年前

    Objective-C确实新增了Generics。然而,它们并没有像在Java中那样充分实现。在Objective-C中,可以在接口上使用它们,但在实现中,必须使用 id 或泛型定义的基类型。

    我写了一篇 blog post 在那里我展示了它的工作原理。希望这能回答你的问题。