用Swift實現MD5演算法&引入第三方類庫(MBProgressHUD),Swift實現MD5演算法
之前項目裡面是用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的用法我就不詳細展開說了,一個功能很強大,又很美觀的第三方控制項,大家可以自己研究下