关于swift - 网络请求+MD5,混合编程

来源:互联网 发布:手机淘宝电影在线看 编辑:程序博客网 时间:2024/05/18 03:18

因为这几天上传迭代版本,所以总是浏览苹果开发者中心,发现最近开发者中心网站的更新频率挺大啊,主页放上了wwdc(世界开发者大会),亮点是Swift代码。所以趁着这几天空闲期抓紧恶补了一下Swift,把这几天的心得记录下来:

1.熟悉Swift的基础知识(很重要)
2.Swift和OC的编程思想是相同的,也就是说,你想要实现一个功能,OC用什么方法实现,同理用swift就可以怎么实现(当然要遵循Swift的规则)。所以如果你有OC基础的话学习Swift就会非常快的。
3.适应Swift的编程习惯,书写规范
4.如果以上三点都可以了,那就直接进入代码的练习了(最好是运用到实际的项目中)

下面就是我在学习Swift时写的一个demo(混合开发),供大家参考:
《demo功能:实现信息的列表展示,通过UITableView,自定义cell,封装网络请求+MD5加密,引入三方SDWebImage,MJReefresh》
在这里可以下载资源 demo下载

这里我主要是介绍一下在Swift中OC文件的引用和网络请求的封装

(1)网络请求的封装(运用MD5加密)
AsyncNetRequest.swift

import UIKit/**extension 和 OC 中的延展一样swift中的包和OC中的block相同**/// 类的延展  -  利用延展来将包定义成私有的宏extension AsyncNetRequest {    typealias sendData = (data: NSData)->Void    typealias sendError = (error: NSError)->Void}class AsyncNetRequest: NSObject {    // 定义一个    var successed = sendData?()    var failed = sendError?()    required init?(coder aDecoder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }    override init() {        super.init()    }    func startAsyncNetWorkWithURLString(urlStr: String, parameters: NSDictionary?, apiStr: String, sucess:(NSData)->Void, failed: (NSError)->Void) {        self.successed = sucess        self.failed = failed        // 进行MD5处理        let MD5 = MD5Encrypt.init()        let encryptString = MD5.MD5EncryptWithParameters(parameters, URLString: urlStr, api: apiStr)        // 得到最终网络请求的字符串        let URLString = String(format:"%@?%@", urlStr, encryptString)        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()        let session = NSURLSession.init(configuration: configuration)        let url = NSURL.init(string: URLString)        let request:NSMutableURLRequest = NSMutableURLRequest.init(URL: url!)        request.HTTPMethod = "GET"        let dataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in            if error  == nil {                self.successed!(data: data!)            }            else {                self.failed!(error: error!)            }        }        dataTask.resume()    }}

(2)MD5加密类

import UIKitclass MD5Encrypt: NSObject {    required init?(coder aDecoder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }    override init() {        super.init()    }    // 获得当前时间戳    func dateWithNowSp()->String {        let formatter: NSDateFormatter = NSDateFormatter.init()        formatter.dateStyle = NSDateFormatterStyle.MediumStyle        formatter.timeStyle = NSDateFormatterStyle.ShortStyle        formatter.dateFormat = "YYYY-MM-dd HH:mm:ss"        let timeZone:NSTimeZone = NSTimeZone.init(name: "Asia/Shanghai")!        formatter.timeZone = timeZone        let nowDate:NSDate = NSDate.init()        // 将其它类型对象转换为字符串类型 - swift的灵活所在        let timeSp = String(nowDate.timeIntervalSince1970)        return timeSp    }    // 对参数字典进行处理    func appendStringWithDictionay(parameters: NSDictionary?)->String {        var parString:String = ""        // 创建可变数组        let array:NSMutableArray = NSMutableArray()        if parameters == nil {            array.addObject("timestamp")        }        else {            array.addObjectsFromArray((parameters?.allKeys)!)            array.addObject("timestamp")        }        // 按照字母顺序排列        let arrayOfAppend = array.sortedArrayUsingSelector(Selector("caseInsensitiveCompare:"))        // 逆行拼接计算        if arrayOfAppend.count > 0 {            for key in arrayOfAppend {                if !key.isEqualToString("timestamp") {                    //                    let lenght = parString.characters.count                    if lenght == 0 {                        parString = String(format:"%@=%@", key as!String, parameters?.objectForKey(key) as!String)                    }                    else {                        parString = String(format: "%@&%@=%@", parString, key as!String, parameters?.objectForKey(key) as!String)                    }                }                else {                    // 获取时间戳并且拼接到参数中                    let timeSp = self.dateWithNowSp()                    if parString.characters.count == 0 {                        parString = String(format: "%@=%@", key as!String, timeSp)                    }                    else {                        parString = String(format: "%@&%@=%@", parString, key as!String, timeSp)                    }                }            }        }        // 返回拼接得到的字符串        return parString    }    // MD5进行加密 - 得到最后的拼接后的请求字符串    func MD5EncryptWithParameters(parameters: NSDictionary?, URLString: String, api: String)->String {        let string = self.appendStringWithDictionay(parameters)        // 用来加密的字符串        let appendString = String(format: "%@?%@%@", api, string, "huodongdawang_start_at_2015")        let appendStrMd5: NSMutableString = NSMutableString()        let orignal_str = appendString.cStringUsingEncoding(NSUTF8StringEncoding)        let lenght = CUnsignedInt(appendString.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))        let results =  UnsafeMutablePointer<CUnsignedChar>.alloc(Int(CC_MD5_DIGEST_LENGTH))        CC_MD5(orignal_str!, lenght, results)        // for循环处理        for var i: Int = 0 ; i < Int(CC_MD5_DIGEST_LENGTH); i++ {            appendStrMd5.appendFormat("%0.2x", results[i])        }        let returnString = String(format: "%@&sign=%@", string, String(appendStrMd5))        return returnString    }}

(3)Swift和OC混合编程-引入OC类
1--首先在Swift项目中创建一个继承与NSObject的类,注意要选择Objective-C语言,如图所示的 Create

这里写图片描述

2--点击Next,继续创建,这时候就会出现如图所示的选择提示,并点击创建

这里写图片描述

3--这时候你的文件中就会出现 项目名-Bridging-Header.h的文件(如果你用不到你创建的这个继承与NSObject的test类可以直接删除),如图所示

这里写图片描述

4--这样我们就可以在这个.h文件里引入我们想要引入的OC文件了,比如SDWebImage,MJRefresh的三方和你自己写的OC文件了。如图

这里写图片描述

这样就可以在你的Swift文件中调用这些三方来实现我们想要实现的功能了。

2 0