0

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

所以这是我的问题。我有一个纯 RESTful API,它返回具有类似于此的通用顶级对象的资源:

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

在 Java/Groovy 中,我使用类似 Jackson 之类的库来执行此绑定功能并编写一个类:

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

这样 aResponseWrapper<MyObject>就能够将 JSONdata属性中的任何内容自动绑定到 type 的对象MyObject。我还为所有包含有关如何分页的信息的集合使用通用集合包装器,如果我能在一些帮助下弄清楚它,我想使用相同的模式!Objective-C 是否支持这种泛型编程?

4

2 回答 2

1

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

我写了一篇博文,展示了它是如何工作的。希望这能回答你的问题。

于 2015-08-26T03:30:57.843 回答
1

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

对你的问:

在 Objective-C 中,您可以像创建类一样简单地创建类,而无需考虑 JSON 传输。你不必关心这个。IE。结果如下所示:

@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 模型有一些评论,但这不是 Q 的主题。)

要自己做,只需获取字典(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 中输入。

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

于 2015-08-26T04:58:31.857 回答