swift碰見的坑 和 第三方庫資源

純 Swift2.0 工程 CocoaChina+ 從 0 到 1 遇到的坑和解決方案

前段時間博主從阿里巴巴跳槽加盟滴滴快的,乘着跳槽的時間差作了兩件一直想作的事: 
一件就是用Swift2.0寫了一個CocoaChina的iOS app(名字叫CocoaChina+,文章的最後會介紹),另一件就是帶着女票去北京玩了一趟,見了見之前讀碩時在實驗室的幾個哥們。整個app從無到有遇到了好多Swift的坑,只惋惜沒有一一記載下來,如今憑着記憶將還記得的坑以及好的東西記載下來與你們分享。react

坑: dyld: Library not loaded: @rpath/libswiftCore.dylib

Swift代碼在模擬器上跑的好好的,忽然到真機就不行了,一塊兒來就報錯dyld: Library not loaded: @rpath/libswiftCore.dylibgit

解決方案

點開你工程target的Build Settings,搜索Embedded Content Contains Swift Code,這個值默認是NO,設置爲YES便可。程序員

參考

http://stackoverflow.com/questions/26024100/dyld-library-not-loaded-rpath-libswiftcore-dylib/26949219#26949219github

坑: Cannot assign to property:」xxx」is a get-only property

只讀屬性固然是不能設置的啦,博主是否是傻。這裏說的狀況有點不同。好比咱們有一份Obectice-C的代碼,其中Class A有個只讀屬性Class BClass B又有一個讀寫屬性Property P,而後咱們把這份OC代碼放到咱們的Swift工程中,用Swift去調用A.B.P,就會報錯Cannot assign to property:"xxx"is a get-only property,有點相似Swift可選鏈的感受,一但OC的類其中一個是隻讀的,接下去的就都是隻讀的了。爲何這裏一直強調OC代碼,由於博主試過Swift的代碼就不存在這個問題。數據庫

解決方案

寫一個SwiftFuckerOC類,在這個類裏面去調用這行代碼返回,恩,SwiftFuckerswift

@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;

坑: 收到Apple的iTunes Store郵件說Invalid Swift Support

當咱們用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語法好的網上一大坨一大坨的,這裏要講的是第三方庫。

RxSwift

玩過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

Neon是一個Swift上另闢蹊徑的佈局庫。

Neon沒有用AutoLayout來包裝,AutoLayout我就不吐槽了,由於已經無力吐槽了。不過Swift上有個庫叫作Snapkit,是從OC的Masonry演變過來的,如今Masonry也歸屬SnapKit組織名下了。不過Masonry的文檔已經寫的很清楚了:如今俺們只作bugfix以及合併一些高質量的PR,趕忙去看看Snapkit吧。可見Swift在國外儼然已成主流了。

說回Neon,他的語法相似描述,很是簡單,能夠有效減少咱們佈局代碼的行數,不過我的感受一行代碼略長。固然博主也是從App發佈後才知道這個庫的,因此打算在App的下個版本接入Neon

SQLite.swift

博主原本是用OC上老牌的FMDB,可是當時FMDB接入Swift2.0工程一直報錯,FMDB的做者也一直沒怎麼關心這件事,可能當時Swift2.0仍是Bete的緣故。後來就接了SQLite.swift,整體來講蠻好用的,可能個人App自己存儲的需求就比較簡單,不過我問過SQLite.swift的做者,SQLite.swift是沒有緩存的,若是你要頻繁操做一個數據庫中的表數據的話,最好本身作一下緩存。

SwiftyUserDefaults

操做NSUserDefaults很麻煩,每次都要寫好幾行代碼。SwiftyUserDefaults很好的利用了Swift的語法特性,讓NSUserDefaults的操做達到了超級簡單的水準,好比:

Defaults[colorKey] = "red"
Defaults[colorKey] // => "red", typed as String

恩,領先OC好幾年~

Ji

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+

先說一下CocoaChina+相對於市面上的app的幾個亮點吧:

1.代碼高亮

目前市面上的第三方的CocoaChina的客戶端app都沒有作代碼高亮,包括官方的Wap頁面。這致使咱們在手機端看博文的時候一到代碼部分就很是蛋疼。CocoaChina+很好的解決了這個問題,極大的提升了閱讀的體驗。

2.流量更省

文章渲染須要的CSS和JS代碼CocoaChina+直接打包進了app內,每次文章加載的時候就再也不須要去服務端獲取一次了,極大的提升了加載速度,節省了用戶的流量。

3.純黑設計

整個app採用純黑色的設計,程序員都喜歡把本身的編輯器或者IDE界面調整成黑色,這樣才能夠把精力都集中在內容上,CocoaChina+的用戶也基本都是程序員,所以也採用了純黑色的設計,讓用戶在閱讀文章的時候精力更加集中。

4.內置聊天室

app內部整合了聊天室的功能,開發者能夠直接進入和其餘開發者直接匿名交流。是否是很好玩。

再說說這個app後續版本迭代須要更新的地方:

1.論壇

CocoaChina論壇因爲有不少Apple的logo。因此目前App內的論壇都把圖片去掉了,目前上線的是一個簡單的論壇功能,後續會着力更新論壇模塊,CocoaChina的論壇作的仍是很牛B的,因此後續必定會有一個很nice的論壇模塊展現在CocoaChina+中

2.登錄

CocoaChina+目前沒有登陸功能,致使目前論壇上你們還不能直接評論,這個後續也會更新維護

3.聊天界面

CocoaChina+的聊天功能是整合了第三方的UI,不是很nice,後續樓主會本身用Swift重寫一套簡潔的聊天UI更新上去

3.技術層面

CocoaChina+是一個純Swift2.0的項目,用的第三方庫也是能有Swift的就用Swift,最後纔會考慮Objective-C。後續也會對代碼作一次重構,整合進RxSwift(Swift版的ReactiveCocoa)和Swit上的佈局框架Neon。

4.iPad版本

目前app只支持iPhone客戶端,後續會推出iPad客戶端

最後附上App安裝二維碼

以及部分截圖:



關於項目開源

這個App是純Swift2.0編寫的,目前項目還有不少沒有上線的功能,部分功能還須要改善,代碼也還須要整理,所以還不打算開源。不過等全部功能都上線了,樓主會整理下代碼後開源到Github。到時候也會在App內發Push推送周知你們.不過這個過程可能會比較漫長,畢竟是我的項目,只能抽業餘時間來作,還請你們耐心等待~

整個app整合了不少第三方平臺,如友盟,極光推送,Google-Admob,環信IM等,對於從此有想作Swift項目的同窗有很大的參考價值。

但願有一天CocoaChina+會成爲一個iOS開發者共同維護的App!

相關文章
相關標籤/搜索