前言
現在iOS的開發語言 有
OC
和
Swift
Swift
本來就支援
泛形
OC
從
XCode7
後也支援
泛形
了
OC庫
現在支援
JSON
和
Model
轉換的
OC庫
有很多 例如:
-
MJExtension
-
YYModel
-
Mantle
-
FastEasyMapping
-
JSONModel
前三種無侵入 後兩種則需要修改
Model
推薦使用
MJExtension
和
YYModel
但是它們都
不支援
帶
泛形的Model
轉換
Swift庫
現在支援
JSON
和
Model
轉換的
Swift庫
常用的如下
-
ObjectMapper
-
SwiftyJSON
它們都
支援
帶
泛形的Model
轉換
泛形
OC泛形
ZJUser.h
#import <objc/NSObject.h>
@interface ZJUser : NSObject
@property(readwrite,nonatomic,assign) int userId;
@property(nonatomic,copy)NSString* name;
@end
複制
ZJUser.m
#import <Foundation/Foundation.h>
#import "ZJUser.h"
@implementation ZJUser
@end
複制
ZJResult.h
#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
#import <Foundation/Foundation.h>
#import "ZJResult.h"
@implementation ZJResult
@end
複制
使用方式
ZJResult<ZJUser *> *result = [[ZJResult<ZJUser *> alloc]init];
複制
配合
AFNetworking
代碼
也就是
泛形
的部分 重新轉換 并指派
ZJResult<ZJUser *> *result = [ZJResult<ZJUser *> yy_modelWithJSON:responseObject];
result.data = [ZJUser yy_modelWithJSON:responseObject[@"data"]];
NSLog(@"%@",result.message);
NSLog(@"%@",result.data.name);
複制
Swift泛形
配合SwiftyJSON
import Foundation
import SwiftyJSON
public protocol ZJSwiftyJSONAble {
init?(jsonData:JSON)
}
複制
obj
為數組
import Foundation
import SwiftyJSON
class 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
為對象
import Foundation
import SwiftyJSON
class 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"])
}
}
複制
對象
import Foundation
import SwiftyJSON
class 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
}
}
複制
使用方式
// String --> model
let result = ZJResultList<ZJArticle>(jsonData:json);
// model --> String
if let string = result.rawString() {
}
複制
配合ObjectMapper
import Foundation
import ObjectMapper
struct ZJResult<T: Mappable>: Mappable {
var success: Bool!
var msg: String!
var obj: [T]?
init?(map: Map) {
}
// Mappable
mutating func mapping(map: Map) {
success <- map["success"]
msg <- map["msg"]
obj <- map["obj"]
}
}
複制
import Foundation
import ObjectMapper
struct ZJArticle: Mappable {
var title: String!
var tags: String!
var description: String!
var date: String!
var path: String!
var url: String!
init?(map: Map) {
}
// Mappable
mutating func mapping(map: Map) {
title <- map["title"]
keywords <- map["keywords"]
description <- map["description"]
date <- map["date"]
path <- map["path"]
url <- map["url"]
}
}
複制
使用方式
// JSON String --> Model
let result = Mapper<ZJResult<ZJArticle>>().map(JSONString: JSONString)
// Model --> JSON String
let JSONString = Mapper().toJSONString(result, prettyPrint: true)
複制