【iOS】在Swift中使用JSONModel

前言

首先所有的Model还是使用oc来写——看到这一句是不是想关网页了- - #,在swift里面直接写一直报错所以就将就用oc来写了,这里主要是分享一下搭配Alamofire使用的经验。

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com

农民伯伯: http://over140.cnblogs.com

正文

这里不讨论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)
            }

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

结束

以后还会分享更多swift的经验,欢迎交流!

时间: 2024-10-23 11:18:49

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

【iOS】Swift中扩展extension与协议protocol

一起连带前面几篇Playground小结代码都转到github上了,注释写了很多,主要方便自己以后可以翻翻看.Swift语法主要部分差不多就这些了.当然还有泛型.运算符重载.ARC.闭包之类的补充. 一.扩展(extension) 扩展 extension(类似OC中的分类,但Swift中没有名字), 即使在没有权限获取到原始代码的情况下,为类增加新功能. 注意: 只要定义了扩展, 那么该扩展对该类的实例都是可用的. extension SomeType{ //添加到SomeType的新功能写在

【iOS】Swift中Playground,常量、变量、字符串等小结

一.代码及书写的几点变化(相比于OC) 1. 更像Java,Javascript或Python的格式了 2. 结尾的分号可写可不写了(同一行的多条语句中间必须加分号) 3. 不需要写main函数了,直接是从上往下执行 4. 文件后缀变.swift了,不再是.h与.m两个文件了 ...... 二.Playground Playground顾名思义,Play是玩的意思,ground是地方的意思.拿来玩.写demo或者测试很nice.在WWDC上演示了Playground实时显示,并演示了一个简单的小

iOS: 在Swift中优雅的实现Substring

在Swift中,当我们想要截取某个字符串时,方法如下: let carNumber = "沪A12345" let startIndex = advance(userCar.carPlateNumber.startIndex, 0) let endIndex = advance(startIndex, 1) let range = startIndex..<endIndex println(carNumber[range]) // 输出沪 呃,好怀念substring方法啊,那我

奔五的人学IOS:Swift中的protocol及其应用实例

最近在学习ios抓取网页内容时遇到各种重复代码的问题,看着这么多重复的代码,感觉实在不爽,于是学习了ios的protocol. 在我看来这个protocol其实应该是Java中的interface. 也就是定义一个协议(或者叫接口),定义一堆方法,让实现了该方法的类的实例传入即可. 在我的工程中,抓取不同网页的viewcontroller,获取网页的代码完全是一模一样的,除了网址不同以外,别无二致,所以这一部分提取出来作为一个类,专门实现上网取数据,数据取到了需要通知viewcontroller

【iOS】Swift中的函数、断言、枚举等

函数与方法.枚举等的书写格式与用法较OC还是变化很大的. 一.函数 1.1 无返回值, 无形参 func myTest2(){ println("Hello") } 1.2 有返回值,有形参 func myTest1( num1:Int , num2:Int ) -> String{ return String(num1 + num2) } 1.3 外部参数. (相当于给参数起了个别名,方便识别记忆) func myTest3 (myNum1 num1 :Int ,myNum2

iOS开发——开发总结Swift篇&amp;Swift中的条件编译

Swift中的条件编译 在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如: 1 #if TARGET_OS_IPHONE 2 3 #define MAS_VIEW UIView 4 5 #elif TARGET_OS_MAC 6 7 #define MAS_VIEW NSView 8 9 #endif 在swift中,由于对C语言支持没有Objective-C来得那么友好(暂时不知swift 2到C的支持如何),所以我们无

iOS开发--Swift 最近项目开发中遇到的一些小问题与解决方法

1, Swift 修改导航栏颜色 self.navigationController?.navigationBar.barTintColor 2, Swift button 属性设置时直接进行初始化 var leftButton : UIButton = UIButton(type: UIButtonType.Custom) 由于是read-only属性, 所以不可以后修改, 直接在初始化的时候设置. Type不推荐用system, 会自动渲染成蓝色. 3, Swift的Bool类型 还是一贯的

ios学习:swift中实现分享到微博、facebook,twitter等

在swift中打开分享功能原来是如此的简单. 1.首先须要 import Social 2.在分享button事件以下 var controller:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeSinaWeibo) controller.setInitialText("一起来swift吧!") controller.addImage(UIImage(named: "

Swift中编写单例的正确方式

Swift中编写单例的正确方式 2015-12-07 10:23 编辑: yunpeng.hu 分类:Swift 来源:CocoaChina翻译活动 14 10647 Objective-CSwift单例 招聘信息: Cocos2d-x 工程师 cocos2dx手游客户端主程 wp开发 iOS开发工程师 iOS软件工程师 iOS研发工程师 iOS讲师 iOS开发工程师 iOS高级开发工程师 iOS 高级软件工程师 iOS高级开发工程师 本文由CocoaChina译者leon(社区ID)翻译自kr