前段時間博主從阿里巴巴跳槽加盟滴滴快的,乘着跳槽的時間差作了兩件一直想作的事:
一件就是用Swift2.0寫了一個CocoaChina的iOS app(名字叫CocoaChina+,文章的最後會介紹),另一件就是帶着女票去北京玩了一趟,見了見之前讀碩時在實驗室的幾個哥們。整個app從無到有遇到了好多Swift的坑,只惋惜沒有一一記載下來,如今憑着記憶將還記得的坑以及好的東西記載下來與你們分享。react
Swift代碼在模擬器上跑的好好的,忽然到真機就不行了,一塊兒來就報錯dyld: Library not loaded: @rpath/libswiftCore.dylib
git
點開你工程target的Build Settings
,搜索Embedded Content Contains Swift Code
,這個值默認是NO,設置爲YES便可。程序員
只讀屬性固然是不能設置的啦,博主是否是傻。這裏說的狀況有點不同。好比咱們有一份Obectice-C的代碼,其中Class A
有個只讀屬性Class B
,Class B
又有一個讀寫屬性Property P
,而後咱們把這份OC代碼放到咱們的Swift工程中,用Swift去調用A.B.P
,就會報錯Cannot assign to property:"xxx"is a get-only property
,有點相似Swift可選鏈的感受,一但OC的類其中一個是隻讀的,接下去的就都是隻讀的了。爲何這裏一直強調OC代碼,由於博主試過Swift的代碼就不存在這個問題。數據庫
寫一個SwiftFucker
OC類,在這個類裏面去調用這行代碼返回,恩,SwiftFucker
!swift
@interface SwiftFucker : NSObject + (void)fuckSetIsAutoLoginEnabled; @end @implementation SwiftFucker + (void)fuckSetIsAutoLoginEnabled { //Swift中chatManager是readonly,會讓他的屬性IsAutoLoginEnabled也變成readonly [[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES]; } @end
Swift中就直接這樣調:緩存
SwiftFucker.fuckSetIsAutoLoginEnabled() //EaseMob.sharedInstance().chatManager.isAutoLoginEnabled = true;
當咱們用Xcode構建打包後提交到AppStore,而後準備喝杯咖啡,喝完看看iTunesConnect後臺對咱們的App處理完畢沒,完畢了就能夠提交審覈了,但是千等萬等一直提示你的構建正在處理
,過了好一會你的開發者郵箱就收到了Apple的郵件說你的App有問題啊,不支持Swift啊:app
Invalid Swift Support - The files libswiftCoreAudio.dylib, libswiftCoreMedia.dylib don’t match /Payload/CocoaChinaPlus.app/Frameworks/libswiftCoreAudio.dylib, /Payload/CocoaChinaPlus.app/Frameworks/libswiftCoreMedia.dylib. Make sure the files are correct, rebuild your app, and resubmit it. Don’t apply post-processing to /Payload/CocoaChinaPlus.app/Frameworks/libswiftCoreAudio.dylib, /Payload/CocoaChinaPlus.app/Frameworks/libswiftCoreMedia.dylib.
其實Swift工程有個坑,就是Swift爲了支持以前的OS版本,會將Swift相關的lib所有打包到咱們的工程中,也就是上面列出來的libswift相關的庫,因此你不妨試一下,新建一個OC的工程和一個Swift的工程,而後各自打包,OC的才幾百K,Swift的5M,哎,啥都沒幹呢,就感受被Swift幹了~。這5M就是Swift運行時相關的lib。那上面Apple告訴咱們app裏找不到這幾個庫,實際上是Cocoapods的bug,將咱們的Cocoapods更新到目前最新的0.39.0便可。框架
https://github.com/CocoaPods/CocoaPods/issues/4188編輯器
以上是博主目前能記得的Swift工程會遇到的噁心的坑,後續要是想起來其餘的坑確定會上來填坑,哎,作筆記有多重要,之後感受要把本身遇到的每一個bug,每一個坑都記錄下來,按期整理,搞很差還能出本書,哈哈~。
說完坑,咱們再來講說Swift中 好的 讓人激動人心的 Objective-C沒有的 激起寫代碼慾望的(好想修飾詞太多了)的好東西吧。固然不是講語法,講Swift語法好的網上一大坨一大坨的,這裏要講的是第三方庫。
玩過Objective-C的MVVM的同窗確定知道ReactiveCocoa這個庫,吊炸天的一個庫,目前Github上的Star已經破萬了。那Swift上有沒有這樣的庫呢,
固然有,那就是RxSwift。
固然,ReactiveCocoa如今是4.0版本了,他在3.0版本的時候就出了Swift版的API,這裏並不想討論在Swift工程中那個庫更好,stackoverflow上也有人全方位的比較過着兩個庫:ReactiveCocoa vs RxSwift - pros and cons,看官們不妨能夠移步過去看一下。
不過樓主最後仍是打算使用RxSwift,畢竟用Swift實現,沒有歷史包袱,並且RxSwift的文檔和Demo實在太全面太好了。並且RxSwift是ReactiveX組織推出的,正宗王老吉,正宗好聲音,不是,皇族血統,德瑪西亞~
博主是在App發佈後才瞭解到這個庫,因此打算在App的下個版本接入RxSwift,到時候再分享接入心得給你們。
Neon是一個Swift上另闢蹊徑的佈局庫。
Neon沒有用AutoLayout來包裝,AutoLayout我就不吐槽了,由於已經無力吐槽了。不過Swift上有個庫叫作Snapkit,是從OC的Masonry演變過來的,如今Masonry也歸屬SnapKit組織名下了。不過Masonry的文檔已經寫的很清楚了:如今俺們只作bugfix以及合併一些高質量的PR,趕忙去看看Snapkit吧。可見Swift在國外儼然已成主流了。
說回Neon,他的語法相似描述,很是簡單,能夠有效減少咱們佈局代碼的行數,不過我的感受一行代碼略長。固然博主也是從App發佈後才知道這個庫的,因此打算在App的下個版本接入Neon
博主原本是用OC上老牌的FMDB,可是當時FMDB接入Swift2.0工程一直報錯,FMDB的做者也一直沒怎麼關心這件事,可能當時Swift2.0仍是Bete的緣故。後來就接了SQLite.swift,整體來講蠻好用的,可能個人App自己存儲的需求就比較簡單,不過我問過SQLite.swift的做者,SQLite.swift是沒有緩存的,若是你要頻繁操做一個數據庫中的表數據的話,最好本身作一下緩存。
操做NSUserDefaults
很麻煩,每次都要寫好幾行代碼。SwiftyUserDefaults很好的利用了Swift的語法特性,讓NSUserDefaults
的操做達到了超級簡單的水準,好比:
Defaults[colorKey] = "red" Defaults[colorKey] // => "red", typed as String
恩,領先OC好幾年~
Ji是一個HTML/XML解析庫,做者是一位加拿大華人,OC上也有相似的庫hpple,當時做者接入的是hpple,後來發現了Ji,就試着接入Ji,而後發現這兩個庫有一個相同功能的API返回的結果不一樣,一問才知道是hpple的bug,果斷拋棄hpple,投入Ji的懷抱。那個bug連接
好了,接下去咱們來講說個人App.作iOS開發的都知道國內最大的蘋果開發者技術資訊網站CocoaChina.com,但是這個網站卻沒有一個App,AppStore上是有一個官方的CocoaChina客戶端app,可是已經好幾年沒有更新了,app裏空無一物,一點數據都沒有。AppStore上也有幾個第三方開發者作的CocoaChina移動端的App,可是他們都有一個很差的地方就是沒有作代碼高亮,這樣讓咱們看博客文章的時候很蛋疼,CocoaChina+就解決了這個問題:
先說一下CocoaChina+相對於市面上的app的幾個亮點吧:
目前市面上的第三方的CocoaChina的客戶端app都沒有作代碼高亮,包括官方的Wap頁面。這致使咱們在手機端看博文的時候一到代碼部分就很是蛋疼。CocoaChina+很好的解決了這個問題,極大的提升了閱讀的體驗。
文章渲染須要的CSS和JS代碼CocoaChina+直接打包進了app內,每次文章加載的時候就再也不須要去服務端獲取一次了,極大的提升了加載速度,節省了用戶的流量。
整個app採用純黑色的設計,程序員都喜歡把本身的編輯器或者IDE界面調整成黑色,這樣才能夠把精力都集中在內容上,CocoaChina+的用戶也基本都是程序員,所以也採用了純黑色的設計,讓用戶在閱讀文章的時候精力更加集中。
app內部整合了聊天室的功能,開發者能夠直接進入和其餘開發者直接匿名交流。是否是很好玩。
再說說這個app後續版本迭代須要更新的地方:
CocoaChina論壇因爲有不少Apple的logo。因此目前App內的論壇都把圖片去掉了,目前上線的是一個簡單的論壇功能,後續會着力更新論壇模塊,CocoaChina的論壇作的仍是很牛B的,因此後續必定會有一個很nice的論壇模塊展現在CocoaChina+中
CocoaChina+目前沒有登陸功能,致使目前論壇上你們還不能直接評論,這個後續也會更新維護
CocoaChina+的聊天功能是整合了第三方的UI,不是很nice,後續樓主會本身用Swift重寫一套簡潔的聊天UI更新上去
CocoaChina+是一個純Swift2.0的項目,用的第三方庫也是能有Swift的就用Swift,最後纔會考慮Objective-C。後續也會對代碼作一次重構,整合進RxSwift(Swift版的ReactiveCocoa)和Swit上的佈局框架Neon。
目前app只支持iPhone客戶端,後續會推出iPad客戶端
最後附上App安裝二維碼
以及部分截圖:
這個App是純Swift2.0編寫的,目前項目還有不少沒有上線的功能,部分功能還須要改善,代碼也還須要整理,所以還不打算開源。不過等全部功能都上線了,樓主會整理下代碼後開源到Github。到時候也會在App內發Push推送周知你們.不過這個過程可能會比較漫長,畢竟是我的項目,只能抽業餘時間來作,還請你們耐心等待~
整個app整合了不少第三方平臺,如友盟,極光推送,Google-Admob,環信IM等,對於從此有想作Swift項目的同窗有很大的參考價值。
但願有一天CocoaChina+會成爲一個iOS開發者共同維護的App!