gpt4 book ai didi

ios - 通用类型 JSON 模型

转载 作者:行者123 更新时间:2023-11-28 21:40:38 27 4
gpt4 key购买 nike

这个问题可能非常简单,也可能非常困难。我并不真正了解 Objective-C 作为一种语言,但我正在尝试构建一个 iPhone 应用程序。我看了JSON Model作为一个潜在的自动数据绑定(bind)库,用于将 JSON 对象转换为我的领域模型。

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

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

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

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

这样一个ResponseWrapper<MyObject>将能够自动绑定(bind) JSON 的 data 中的任何内容MyObject 类型对象的属性.我还为所有集合使用了一个通用的集合包装器,它包含有关如何分页的信息,如果我能在一些帮助下弄清楚的话,我想使用相同的模式! Objective-C 支持这种泛型编程吗?

最佳答案

首先:说 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 模型发表一些评论,但这不是问题的主题。)

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

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

关于ios - 通用类型 JSON 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216994/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com