前言 现在iOS的开发语言 有 OC 和 SwiftSwift 本来就支持泛形OC 从 XCode7 后也支持泛形了
OC库 现在支持 JSON 和 Model 转换的OC库有很多 例如:
前三种无侵入 后两种则需要修改Model 推荐使用MJExtension和YYModel
但是它们都不支持带泛形的Model转换
Swift库 现在支持 JSON 和 Model 转换的Swift库 常用的如下
它们都支持带泛形的Model转换
泛形 OC泛形 ZJUser.h
1 2 3 4 5 6 #import <objc/NSObject.h> @interface ZJUser : NSObject @property (readwrite ,nonatomic ,assign ) int userId;@property (nonatomic ,copy )NSString * name;@end
ZJUser.m
1 2 3 4 5 6 #import <Foundation/Foundation.h> #import "ZJUser.h" @implementation ZJUser @end
ZJResult.h
1 2 3 4 5 6 7 #import <objc/NSObject.h> @interface ZJResult <objectType :NSObject *> : NSObject @property (nonatomic ,copy )NSString * state;@property (nonatomic ,copy )NSString * message;@property (nonatomic ,strong )objectType data;@end
ZJResult.m
1 2 3 4 5 6 #import <Foundation/Foundation.h> #import "ZJResult.h" @implementation ZJResult @end
使用方式
1 ZJResult<ZJUser *> *result = [[ZJResult<ZJUser *> alloc]init];
配合AFNetworking代码 也就是泛形的部分 重新转换 并赋值
1 2 3 4 ZJResult<ZJUser *> *result = [ZJResult<ZJUser *> yy_modelWithJSON:responseObject]; result.data = [ZJUser yy_modelWithJSON:responseObject[@"data" ]]; NSLog (@"%@" ,result.message);NSLog (@"%@" ,result.data.name);
Swift泛形 配合SwiftyJSON 1 2 3 4 5 6 import Foundationimport SwiftyJSONpublic protocol ZJSwiftyJSONAble { init? (jsonData :JSON ) }
obj为数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import Foundationimport SwiftyJSONclass ZJResultList <T : ZJSwiftyJSONAble >: ZJSwiftyJSONAble { var success: String ! var msg: String ! var obj: [T ]? required init? (jsonData :JSON ){ self .success = jsonData["success" ].stringValue self .msg = jsonData["msg" ].stringValue self .obj = jsonData["obj" ].arrayValue.flatMap { T (jsonData: $0 ) } } }
obj为对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import Foundationimport SwiftyJSONclass ZJResultModel <T : ZJSwiftyJSONAble >: ZJSwiftyJSONAble { var success: String ! var msg: String ! var obj: T ? required init? (jsonData :JSON ){ self .success = jsonData["success" ].stringValue self .msg = jsonData["msg" ].stringValue self .obj = T (jsonData: jsonData["obj" ]) } }
对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import Foundationimport SwiftyJSONclass ZJArticle : ZJSwiftyJSONAble { var title: String ! var date: String ! var url: String ! required init? (jsonData :JSON ){ self .title = jsonData["title" ].stringValue self .date = jsonData["date" ].stringValue self .url = jsonData["url" ].stringValue } }
使用方式
1 2 3 4 5 6 let result = ZJResultList <ZJArticle >(jsonData:json);if let string = result.rawString() { }
配合ObjectMapper 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import Foundationimport ObjectMapperstruct ZJResult <T : Mappable >: Mappable { var success: Bool ! var msg: String ! var obj: [T ]? init? (map : Map ) { } mutating func mapping (map : Map ) { success <- map["success" ] msg <- map["msg" ] obj <- map["obj" ] } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import Foundationimport ObjectMapperstruct ZJArticle : Mappable { var title: String ! var tags: String ! var description: String ! var date: String ! var path: String ! var url: String ! init? (map : Map ) { } mutating func mapping (map : Map ) { title <- map["title" ] keywords <- map["keywords" ] description <- map["description" ] date <- map["date" ] path <- map["path" ] url <- map["url" ] } }
使用方式
1 2 3 4 let result = Mapper <ZJResult <ZJArticle >>().map(JSONString: JSONString )let JSONString = Mapper ().toJSONString(result, prettyPrint: true )