之前项目里面是用objc写的MD5加密算法,最近在用swift重写以前的项目,遇到了这个问题。好在最后解决了。顺带解决掉的还有如何引入第三方的类库,例如MBProgressHUD(SVProgressHUD)等一些特别好的控件
解决的方法其实是用objc和swift混合编程的方法,利用Bridging-header文件。
什么是Briding-header?你可以简单的理解为在一个用swift语言开发的工程中,引入objective-c文件是需要做的一个串联文件,好比架设了一个桥,让swift中也可以调用objective-c的类库和frame等等。
那么问题来了,如何才能新建这个Briding-header文件?
1.
确保你的工程是用swift建立的
图中的language选择swift
2.
任意新建一个类,语言选取objective-c,
这个步骤仅仅是为了生成我们需要的一个文件;之后我们将删除本步骤中建好的类,所以类名什么的随便起好了
任意写入类名,next之后,我们会得到一条提示,提示我们是否要建立这个bridging-header文件,我们选择是,就可以看到目录中多出来这样一个xxx-bridging-header.h的文件,
然后移除这个文件中的所有内容,并且移除我们之前步骤中生成的objc的.h和.m两个文件(当然如果有用你可以保留下来)。
3.
接下来,在xxx-bridging-header.h 中import进入我们想要的各种文件。
在我的实例项目中共import了两个,第一行是为了写MD5算法,第二行是为了调用第三方的类库,MBProgressHUD
我们分开来说吧:
MD5算法
我们需要import <CommonCrypto/CommonDigest.h>
之后,在你的任意一个.swift文件中,写入下面的代码
extension String{ func md5() ->String!{ let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen) CC_MD5(str!, strLen, result) var hash = NSMutableString() for i in 0 ..< digestLen { hash.appendFormat("%02x", result[i]) } result.destroy() return String(format: hash as String) } }
我的Xcode版本是6.3的beta5,因为6.1.1总是会跳出一个什么XXXkit crash掉的错误,特别烦人,网上找了好久说的方法都没有用,就只好去apple 官网下了个beat版的6.3安装, 感觉好多了。
6.3里面更新了apple watch(细心的朋友可以在上面的图里面发现apple watch的影子) 和swift1.2, 所以一些swift的语法可能有细小差别,不过应该影响不大,这个我参照stackoverflow上的大神的解答:
另一位大神估计是用的和我一样版本的,不过还是在string(format)语句里面有些小的差别
这样,我们就可以直接这样写来调用md5算法:
var str = "test123" var str_Md5 = str.md5()
很简单的吧,因为加入了extension String之后,String类就有了一个函数 md5,结果就是直接返回当前str的MD5加密后的结果
MBProgressHUD
这个就更简单了,去GitHub上下载最新的MBProgressHUD, 然后把.h 和.m 文件拷贝到项目工程里面,可以在之前的图片里面看到,然后在bridging-header.h中加入第二行
#import "MBProgressHUD.h"
然后你就可以在你的项目中这样生成:
//show the loadingNotification let loadingNotification = MBProgressHUD.showHUDAddedTo(self.view, animated: true) loadingNotification.mode = MBProgressHUDModeIndeterminate loadingNotification.labelText = "查询中..."
然后这样消除
MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
关于MBProgressHUD的用法我就不详细展开说了,一个功能很强大,又很美观的第三方控件,大家可以自己研究下