Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 泛型JSON模型_Ios_Objective C_Jsonmodel - Fatal编程技术网

Ios 泛型JSON模型

Ios 泛型JSON模型,ios,objective-c,jsonmodel,Ios,Objective C,Jsonmodel,这个问题可能很简单,也可能很难。我并不真正了解Objective-C作为一种语言,但无论如何我都在尝试构建一个iPhone应用程序。我将其视为一个潜在的automagic数据绑定库,用于将JSON对象转换为我的域模型 这是我的问题。我有一个纯RESTful API,它返回的资源带有一个公共顶级对象,类似于: { "successMessages": [], "errorMessages": [], "data": {} } 在Java/Groovy中,我使用类似于Jac

这个问题可能很简单,也可能很难。我并不真正了解Objective-C作为一种语言,但无论如何我都在尝试构建一个iPhone应用程序。我将其视为一个潜在的automagic数据绑定库,用于将JSON对象转换为我的域模型

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

{
    "successMessages": [],
    "errorMessages": [],
    "data": {}
}
在Java/Groovy中,我使用类似于Jackson的库来实现此绑定功能,并将编写一个类:

public class ResponseWrapper<T>{
    Collection successMessages
    Collection errorMessages
    T data
}
公共类响应包装器{
收集成功消息
收集错误消息
T数据
}

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

Objective-C确实有新添加的泛型。然而,它们并不像在Java中那样完全实现。在Objective-C中,您可以在接口上使用它们,但在实现中,您必须使用泛型定义的
id
或基本类型


我写了一篇文章,展示了它的工作原理。希望这能回答您的问题。

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

对你的问题:

在Objective-C中,您只需像创建类一样创建类,而不考虑JSON传输。你不必关心这件事。即。结果如下所示:

@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" : @()];
在狩猎旅行中被发现


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

Objective-C语言本身并没有什么固有的东西。不过可能有几个库(比如你在第一段中提到的库)。参见@rmaddy,我不确定这个问题在这里有什么帮助。我了解了如何处理JSON模型和关系的基本情况。这是我不知道的仿制药的水平;我不知道。你是说Objective-C不提供这种编程模型?我是说Objective-C没有内置对JSON建模的支持(就像Java没有)。在这两种情况下,您都需要某种类型的库来轻松完成。Objective-C不支持泛型类型。您是否有充分的理由尝试在Objective-C中构建新的应用程序?Swift已经足够成熟,可以让新项目成功地使用它,坦率地说,它是一种更高效的语言。这是一篇rad博客文章,@drekka,谢谢分享!您是否曾经在生产代码的集合中使用过错误的类?我在网上和会谈中都做过这方面的民意调查。结果:<0.1%。没有人会因为误解而需要一些所谓的泛型药。