【iOS】在Swift中使用JSONModel

这里不讨论JSONModel和Alamofire这两个项目,直接上代码

BaseModel.h

#import "JSONModel.h"

@interface BaseModel : JSONModel

-(instancetype)initWithDictionary:(NSDictionary*)dict;

@end

BaseModel.m 

#import "BaseModel.h"

@implementation BaseModel

//Make all model properties optional (avoid if possible)
+(BOOL)propertyIsOptional:(NSString*)propertyName
{
    return YES;
}

-(instancetype)initWithDictionary:(NSDictionary*)dict {
    return (self = [[super init] initWithDictionary:dict error:nil]);
}

@end

所有的Model都要继承BaseModel,其他写法都一样

BaseAPI.swift

    internal func requestModel<T: BaseModel>(method: Method, _ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, success: (T) -> Void, failure: (NSError?) -> Void) {
        mHttpManager.request(method, URLString , parameters: parameters, encoding: ParameterEncoding.JSON)
            .responseJSON { (request, response, data, error) in
                if error == nil {
                    if let dict = data as? NSDictionary {
                        if let model = T(dictionary: dict as [NSObject : AnyObject]) {
                            success(model)
                            return
                        }
                    }
                }
                failure(error)
        }
    }
    
    internal func requestArray<T: BaseModel>(method: Method, _ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, success: (Array<T>) -> Void, failure: (NSError?) -> Void) {
        mHttpManager.request(method, URLString , parameters: parameters, encoding: ParameterEncoding.JSON)
            .responseJSON { (request, response, data, error) in
                if error == nil {
                    if let array = data as? NSArray {
                        if let result = T.arrayOfModelsFromDictionaries(array as [AnyObject]).copy() as? Array<T>{
                            success(result)
                            return
                        }
                    }
                }
                failure(error)
        }
    }

  代码说明

1、mHttpManager这个是Alamofire的Manager对象

2、注意服务端的返回的数据格式,这里支持Model和Array<Model>

3、注意在Swift里面NSDictionary转Model,用T(dictionary: dict as [NSObject : AnyObject]),这个T就是具体的泛型类型

4、注意在Swift里面NSArray转Model数组,用T.arrayOfModelsFromDictionaries(array as [AnyObject]).copy() as? Array<T>,注意不要用BaseModel. arrayOfModelsFromDictionaries(编译不会报错但是类型转不出来)

5、具体用法:

            public func casts(success: (Array<CustomModel>) -> Void, failure: (NSError?) -> Void) {
                requestArray(Method.GET, URL_CASTS, parameters: nil, success: success, failure: failure)
            }
            
            public func like(id: String, success: (CustomModel) -> Void, failure: (NSError?) -> Void) {
                requestModel(Method.PATCH, String(format: URL_CASTS_LIKE, id), parameters: nil, success: success, failure: failure)
            }

非常轻松和简单, 可以少写很多重复代码。

后期维护

2015-05-20 Alamofire兼容iOS7有点问题,设置head不管用,请参考我另外一篇文章:【iOS】Alamofire库在iOS7下设置Head无效的问题

2016-04-21 

错误:fatal error: NSArray element failed to match the Swift Array Element type,参考帖子这里

Swift 中使用不支持嵌套 JSONModel 数组

@property (strong, nonatomic) NSArray<App *> *apps;
@property (strong, nonatomic) NSArray<User *> *users;

解决办法: 

@property (strong, nonatomic) NSArray<NSDictionary *> *apps;
@property (strong, nonatomic) NSArray<NSDictionary *> *users;

         然后在 Swift 这边转一下

                   self.users = users.map{ User(dictionary: $0 ) }
                   self.apps = apps.map{ App(dictionary: $0 ) }

 本文转自博客园农民伯伯的博客,原文链接:【iOS】在Swift中使用JSONModel,如需转载请自行联系原博主。

时间: 2017-12-04

【iOS】在Swift中使用JSONModel的相关文章

IOS开发: 在Swift中使用AFNetworking

 今天主要简单说一下如何在Swift工程中使用时下比较流行的AFNetworking请求框架.     由于目前AFNetworking目前还没有Swift版本,因此我们的工程使用cocoapod来安装AFNetworking. 这是我的Prodfile文件,cocoapod的使用方法跟使用OC是时候是一模一样的,为了方便,我们在工程中随便创建一个类,选择语言OC,我们会发现工程中会多出来一个SwiftStudy-Bridging-Header.h文件,删除创建的oc类,在这里引入   开发:

IOS开发:在Swift中使用JavaScript的方法和技巧

  在RedMonk发布的2015年1月编程语言排行榜中,Swift采纳率排名迅速飙升,从刚刚面世时的68位跃至22位,Objective-C仍然稳居TOP10,而JavaScript则凭借着其在iOS平台上原生体验优势成为了年度最火热的编程语言. 开发:在Swift中使用JavaScript的方法和技巧-"> 而早在2013年苹果发布的OS X Mavericks和iOS 7两大系统中便均已加入了JavaScriptCore框架,能够让开发者轻松.快捷.安全地使用JavaScript语言

[译] iOS 响应式编程:Swift 中的轻量级状态容器

本文讲的是[译] iOS 响应式编程:Swift 中的轻量级状态容器, 原文地址:Reactive iOS Programming: Lightweight State Containers in Swift 原文作者:Tyler Tillage 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:deepmissea 校对者:FlyOceanFish iOS 响应式编程:Swift 中的轻量级状态容器 事物的状态 在客户端架构如何工作上,每一个 iOS

[译]iOS开发者在Swift中应避免过度使用

本文讲的是[译]iOS开发者在Swift中应避免过度使用, 就在前几天,我终于把项目迁移到了Swift2.2,在使用SE-0022建议的#selector语句时,我遇到了一些问题.如果在protocol extension中使用#selector,这个protocol必须添加@Objc修饰符.而之前的Selector("method:")语句则不需要添加. 通过协议的扩展配置视图控制器 为了达到本文的目的,我简化了工作中项目的代码,但所有核心的思想都保留着.一种我经常在swift里用的

[译] Swift 中关于并发的一切:第一部分 — 当前

本文讲的是[译] Swift 中关于并发的一切:第一部分 - 当前, 原文地址:All about Concurrency in Swift - Part 1: The Present 原文作者:Umberto Raimondi 译文出自:掘金翻译计划 译者:Deepmissea 校对者:Feximin,zhangqippp Swift 中关于并发的一切:第一部分 - 当前 在 Swift 语言的当前版本中,并没有像其他现代语言如 Go 或 Rust 一样,包含任何原生的并发功能. 如果你计划异

Swift中的闭包(Closure)[转]

闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储着一个整数,一个String类型包含着一串字符,同样,闭包是一个包含着函数的类型.有了闭包,你就可以处理很多在一些古老的语言中不能处理的事情.这是因为闭包使用的多样性,比如你可以将闭包赋值给一个变量,你也可以将闭包作为一个函数的参数,你甚至可以将闭包作为一个函数的返回值.它的强大之处可见一斑. 在Swift的很多文档教材中都说函数是"一等公民",起初我还不是很理解"一等公民"是什么意思,但当我理解了闭包以

Swift中的注释以及表达式

Swift程序有两类注释:单行注释(//)和多行注释(/*...*/).注释方法与C.C++和Objective-C语言都是类似的,下面详细介绍一下.1. 单行注释单行注释可以注释整行或者一行中的一部分,一般不用于连续多行的注释文本.当然,它也可以用来注释连续多行的代码段.以下是两种注释风格的例子: if x > 1 { //注释1 } else { return false; //注释2 } //if x > 1 { // //注释1 //} else { // return false;

ios 用swift语言的,然后链接数据库,sqlite。

问题描述 ios 用swift语言的,然后链接数据库,sqlite. ios开发,用是swift语言.如何链接SQLite数据库.求详细代码 解决方案 iOS数据库Sqliteios SQlite操作数据库iOS中操作SQLite数据库 解决方案二: 用fmdb. http://www.tuicool.com/articles/jA3yUfj

[译]Swift 中的通用数据源

本文讲的是[译]Swift 中的通用数据源, 原文地址:Generic Data Sources in Swift 原文作者:Andrea Prearo 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:Swants 校对者:iOSleep Swift 中的通用数据源 在我开发的绝大多数 iOS app 中, tableView 和 collectionView 绝对是最常用的 UI 组件.鉴于设置一个 tableView 或 collectionVie

Swift中的一些关键字

原文:Swift中的一些关键字 以下关键字关于引用传参.属性.修改成员变量.静态变量.索引和构造函数重载 读过The Swift Programming Language的人都能看得出,我上面的这几个说法全不是apple的习惯用语.之所以这么起题目是因为很多最近转到swift下,但原本又不是搞ios开发的人,并不习惯apple的说法.他们经常在查询他人博客的时候因为某些名词的表示方式不同,而把原本简单的问题搞得一头雾水.就像我在刚接触oc的时候,很奇怪message和protocol的说法一样,