Swift App項目總結

最近公司新開了一個項目,因爲個人同事的離職,因此就剩我本身了。因而就果斷的使用純純Swift寫了,以前也用過Swift,不過很早了,那時候Swift還不穩定,每次一升級Xcode,Swift升級之後語法也跟着變了,因此就多了一堆的警告。如今Swift進化到3.X了,Swift衆多新特性的支持,讓我果斷的要投入生產環境使用了。
這篇博客是項目上線了,能夠有兩天的空閒時間了,能夠寫寫博客了,記錄一下第一個Swift項目遇到的一些問題。也會順帶開源一些我寫的小控件,你們能夠參考或者使用一下。html


Tips

1.webkit相關

內置的瀏覽器拋棄webview升級到了webkit,內存等各方面都要比以前好不少。不一樣的地方是還要實現WKUIDelegate的協議,由於alert彈窗都是須要你實現協議了,這樣更能讓本身的app的web部分和原生部分樣式等方面的統一。不過和前端交互的時候須要我這邊自定義User-Agent(UA),以肯定究竟是在哪打開(微信,android,其它手機瀏覽器?)的。WKWebView有個屬性是customUserAgent,不過遺憾的是隻能在iOS9.0以上使用,我還要兼容iOS8呢。
不過我喜歡把這種配置單獨的在程序的某個單例裏面,這樣即便有多個包裹WKWebView的controller也能夠統一配置(在程序啓動的時候執行一下了事)。由於我還不想破壞掉原有的UA,我只是想在保留原有的UA的基礎上,在符合UA規則下添加一條自定義的參數便可,畢竟徹底自定義UA在訪問其餘站點的時候可能會有瀏覽器識別問題。基於這兩點就踩了一個坑:
WKWebView有個方法能夠獲取當點的默認UA前端

open func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Swift.Void)? = nil)

可是由於是經過回調的方式,雖然WKWebView已經晚於設置UA很久了,仍是會有不能生效的問題,只有第二次new WKWebView的對象才能夠,很奇怪。無奈啊,後來想到了以前的UIWebView,在那個全局配置的單例裏面經過java

open func stringByEvaluatingJavaScript(from script: String) -> String?

獲取設備默認的UA,而後拼接字符串,而後再經過設置android

UserDefaults.standard.register(defaults: ["UserAgent": newUA])

就能夠了。git

2.String轉Class

此次也把我以前的一篇博客的iOS controller解耦探究實現——第一次寫博客OC代碼用Swift重寫。
這個東西的主要原理就是經過String轉Class,這個要用到OC的Runtime(感受仍是離不開這種擁有魔法黑科技的Runtime啊),結果String不是單單的ClassName了,須要添加App自己的Bundle name加英文點號再加ClassName。具體的蘋果官方文檔有說明。示例以下:github

let myPersonClass: AnyClass? = NSClassFromString("MyGreatApp.Person")web

暫時就想起來了以上2個小Tips,之後想起來再作補充吧json

Swift開源庫

SwiftyJSON

用過Swift原生的解析json就知道了,由於Swift引入了optional,雖然使得Swift比OC更安全了,可是對於多層級的json取值簡直能折磨死人。用了SwiftyJSON,感受整個Swift的json解析不再是問題了。強烈安利使用,看看這個庫的源代碼,基本也能學習很多知識呢。swift

Kingfisher

一個Swift的圖片下異步加載緩存模塊,做者也是說了受SDWebImage的啓發。寫的也很是棒,效果也很好。固然由於要配合我本身的一個banner輪播圖控件,我修改了一下源代碼(僅僅修改了圖片的緩存文件夾),哈哈,個人修改版也放在了個人GitHub,在cunstom分支裏面。
能夠在CocoaPods這樣引用就能夠了瀏覽器

pod 'Kingfisher', :git => 'https://github.com/ysk666666/Kingfisher.git', :branch => 'custom'

PS:一開始我都用了SDWebImage了,也寫了不少的邏輯了,可是後來發現了這個庫後,看了一下代碼,真的很棒,而後又用了一個小時把以前的邏輯都遷移到了Kingfisher 上面,😅。另外這個庫的做者真的是大神,每次看他的博客感受都能收穫不少

JXPhotoBrowser

這是一個Swift寫的大圖瀏覽器,感受寫的很棒,邏輯也很嚴謹,動畫效果也很好。也很值得推薦,固然你們看到不錯的也能夠評論推薦。圖片加載是也是基於Kingfisher

我也要貢獻點東西

YRouter的改進&Swift版本

代碼在個人GitHub: YRouterSwiftDemo
這個其實本質上就是藉助String轉Class,而後這個String來源於URL的host,因此URL的host部分必須和VC的名字保持一致(URL的scheme能夠隨便自定義),這樣就不再用像以前的時候每寫一個VC都要去某個地方註冊一下,不過各有利弊。原來的那種方式能夠定義比較短的host,經常使用的VC跳轉寫起來會很方便。
原理的另一部分是給系統的UIViewController經過Runtime模擬屬性的方式,添加了一個any類型的parameter。這個就是用來往目標VC傳遞參數的,具體的格式能夠自定義,或者跟同事約定好,基本就能夠了。
直接把demo的class文件夾裏面的YRouterNavigationController.swift拖到你的工程裏面,就可使用了,載配合上一個自定義的BaseVC,簡直是VC跳轉最舒服的方式。源碼很簡單,看看應該就能理解。

輪播圖

輪播圖,這個確實懶得去找而且評估比較好的開源項目了,邏輯也很是簡單。就本身動手造了一個。YRouterSwiftDemo
YRouterSwiftDemo支持代碼和xib的初始化,支持block和delegate的回調方式。簡便易用,文件被存儲在了沙盒的/Caches/NetImagesCache/文件夾內,能夠配合個人修改版Kingfisher使用,清理圖片緩存的時候就能夠直接調用Kingfisher的方法了。😄
簡單的說一這個輪播圖的實現原理吧:scrollView的contentsize爲三倍其自己大小,currentImageView始終位於其中部,左滑就把otherImageView放到右邊,滑動完成,從新設置currentImageView的圖片並修改scrollView.contentOffset使之從新回到展現currentImageView的位置,向右滑動也是一樣的道理。這樣就能無限的循環了。大致原理就是這樣,兩個imageView,三倍自己控件寬度的contentSize的scrollView,就能夠無限的滑動了。剩下的就是一些細節的調整了,具體能夠去看看源代碼。

搜索框

還未整理,等待往後填坑😄

最近搜索或推薦控件

還未整理,等待往後填坑😄

通過這個Swift項目,我感受我已經喜歡上Swift的簡潔語法,閉包等特性,寫出的代碼比OC還要優雅,之後能用Swfit的項目確定會用了。
PS:由於以前的時候我本身私有的代碼倉庫都放在了coding上了,可是大約在4月份的時候發了通知說6月份開始普通用戶的私有倉庫只能有2個了,而且每一個倉庫的容量被限制在了128MB,納尼?我以前全部的私有和公開的代碼都在上面啊,而後看了一下,199RMB/年的帳戶也只能100個私有倉庫,因此決定,之後會慢慢的把私有倉庫遷移到碼雲上,而後公開的放在GitHub上。

相關文章
相關標籤/搜索