Swift环境下使用MJExtension

作者: ame017 | 来源:发表于2017-09-02 11:30 被阅读351次

    最近开始学习swift3.0的新特性
    由于是从OC转过来的
    所以对MJExtension和ESJsonFormat很有感情
    这里分享一下如何在swift环境下使用MJExtension

    所用技术

    • swift
    • MJExtension
    • ESJsonFormat
    • Alamofire
    • SwiftyJSON

    安装

    使用pod安装 这里有几个坑

    1. 注意Podfile中加入一行
    use_frameworks!
    

    完整的podfile例

    platform :ios, ‘8.0’
    use_frameworks!
    
    target ‘SwiftDemo’ do
    pod 'Alamofire', '~> 4.5.0'
    pod 'SwiftyJSON', '~> 3.1.4'
    
    pod 'MJExtension', '~> 3.0.13'
    pod 'SVProgressHUD', '~> 2.0.3'
    end
    
    1. 添加Briding-Header.h文件以便引用OC的类
      创建一个.h文件 如Objc-Briding-Header.h
      Apple建议使用-Briding-Header字段作为后缀 这里果断就听苹果爸爸的话了
      在里面import需要的OC的类
      坑:
    • 这里的#import 没有代码提示
      且无论是否是什么类型的类 都用
    #import"xxxx.h"
    

    而不用

    #import<xxxx.h>
    

    例如 完整的Briding-Header.h

    #ifndef Objc_Briding_Header_h
    #define Objc_Briding_Header_h
    
    #import "SVProgressHUD.h"
    #import "MJExtension.h"
    
    //model
    #import "DemoModelOne.h"
    
    #endif /* Objc_Briding_Header_h */
    
    • import之后需要进行一些设置
    1. 在target——>build setting中搜索bridg 把Objective-C Bridging Header路径设置一下,一定要设置对,如果你的桥接文件不是和project工程文件在同一级项目目录中,要记得把你的文件所在的目录加进路径,一定要确保根据这个路径可以找到你的桥接文件。如图


      1.png
    2. 设置一个User Header Search Paths,否则在需要用三方库的地方是调不出来的。在target——>Build Setting里找到search Paths,双击User Header Search Paths后面的空白处,设置目录路径为${SRCROOT} 后边选择recursive。如图


      2.png

    使用

    模型的建立

    这里很多同学直接就去建了swift模型,其实这里应该使用OC模型,如果是swift模型,MJExtension可能不能完美的完成转换.而且建立OC模型,可以使用ESJsonFormat来完成,非常方便.
    关于ESJsonFormat的使用,请参考ESJsonFormat github

    使用Alamofire获取json

    Alamofire是OC中著名开源网络框架AFNetworking的swift版本
    关于Alamofire的使用,请参考Alamofire github

    使用SwiftyJSON

    SwiftyJSON是swift中著名的json解析工具,使用这个插件,可以让json多层连续解析而不产生crash.
    关于SwiftyJSON的使用,请参考SwiftyJSON github

    具体使用代码例

    关于MJExtension的基本用法(OC),请参考作者的介绍MJExtension github

        func getData(_ completion:@escaping ()->Void) -> Void {
            //显示hud
            SVProgressHUD.setStatus("加载中")
            let url = "http://xxxxxx"
            Alamofire.request(url).responseJSON { (response) in
                //隐藏hud
                SVProgressHUD.dismiss()
                response.result.ifSuccess({
                    //使用SwiftyJSON解析json并取数组层数据
                    let json = JSON(response.data as Any)
                    let jsonData = json["goodsRecommendTypeFormBeans"][0]["goodsRecommendFormList"].rawValue
                    for dic in (jsonData as! Array<Any>){
                        //字典转为OC字典不然MJExtension不会进行转换
                        let nsdic = dic as! [NSObject : AnyObject]
                        //用MJExtension转成OC模型
                        let model = DemoModelOne.mj_object(withKeyValues: nsdic)
                        //把模型写入数组
                        self.dataArray.append(model!)
                    }
                    print(self.dataArray)
                    completion()
                })
            }
        }
    

    由此,你获得了一个装满了model的dataArray 尽情折腾吧!

    相关文章

    相关文章

      网友评论

      • 攻城狮的自白:在 Swift 项目你,模型类必须要用 Objective-C 写是吗?:joy:
        Dylan_kuang:我用MJExtension转出来的模型是空模型,里面没数据;好难过,找不到问题
        攻城狮的自白:@ame017 确实解决了MJExtension 在 Swift 中的字典、字典数组转模型取不到值的问题。我之前的项目在 Swift3.0的时候都还能用 MJExtension 基于 Swift 写的模型。
        ame017:@攻城狮的自白 如果用MJExtension的话我的建议是这样的

      本文标题:Swift环境下使用MJExtension

      本文链接:https://www.haomeiwen.com/subject/uiiljxtx.html