好久沒(méi)寫(xiě)技術(shù)文章了,感覺(jué)這個(gè)事情不應(yīng)該被擱置,程序員應(yīng)該努力去學(xué)一些除了寫(xiě)代碼以外的東西。
前段時(shí)間博主從阿里巴巴跳槽加盟滴滴快的,乘著跳槽的時(shí)間差做了兩件一直想做的事:
一件就是用Swift2.0寫(xiě)了一個(gè)CocoaChina的iOS app(名字叫CocoaChina+,文章的最后會(huì)介紹),另外一件就是帶著女票去北京玩了一趟,見(jiàn)了見(jiàn)以前讀碩時(shí)在實(shí)驗(yàn)室的幾個(gè)哥們。整個(gè)app從無(wú)到有遇到了好多Swift的坑,只可惜沒(méi)有一一記載下來(lái),現(xiàn)在憑著記憶將還記得的坑以及好的東西記載下來(lái)與大家分享。
坑: dyld: Library not loaded: @rpath/libswiftCore.dylib
Swift代碼在模擬器上跑的好好的,突然到真機(jī)就不行了,一起來(lái)就報(bào)錯(cuò)dyld: Library not loaded: @rpath/libswiftCore.dylib
解決方案
點(diǎn)開(kāi)你工程target的Build Settings,搜索Embedded Content Contains Swift Code,這個(gè)值默認(rèn)是NO,設(shè)置為YES即可。
參考
坑: Cannot assign to property:"xxx"is a get-only property
只讀屬性當(dāng)然是不能設(shè)置的啦,博主是不是傻。這里說(shuō)的情況有點(diǎn)不一樣。比如我們有一份Obectice-C的代碼,其中Class A有個(gè)只讀屬性Class B,Class B又有一個(gè)讀寫(xiě)屬性Property P,然后我們把這份OC代碼放到我們的Swift工程中,用Swift去調(diào)用A.B.P,就會(huì)報(bào)錯(cuò)Cannot assign to property:"xxx"is a get-only property,有點(diǎn)類(lèi)似Swift可選鏈的感覺(jué),一但OC的類(lèi)其中一個(gè)是只讀的,接下去的就都是只讀的了。為什么這里一直強(qiáng)調(diào)OC代碼,因?yàn)椴┲髟囘^(guò)Swift的代碼就不存在這個(gè)問(wèn)題。
解決方案
寫(xiě)一個(gè)SwiftFuckerOC類(lèi),在這個(gè)類(lèi)里面去調(diào)用這行代碼返回,恩,SwiftFucker!
@interface SwiftFucker : NSObject
+ (void)fuckSetIsAutoLoginEnabled;
@end
@implementation SwiftFucker
+ (void)fuckSetIsAutoLoginEnabled {
//Swift中chatManager是readonly,會(huì)讓他的屬性IsAutoLoginEnabled也變成readonly
[[EaseMob sharedInstance].chatManager setIsAutoLoginEnabled:YES];
}
@end
Swift中就直接這樣調(diào):
SwiftFucker.fuckSetIsAutoLoginEnabled()
//EaseMob.sharedInstance().chatManager.isAutoLoginEnabled = true;
坑: 收到Apple的iTunes Store郵件說(shuō)Invalid Swift Support
當(dāng)我們用Xcode構(gòu)建打包后提交到AppStore,然后準(zhǔn)備喝杯咖啡,喝完看看iTunesConnect后臺(tái)對(duì)我們的App處理完畢沒(méi),完畢了就可以提交審核了,可是千等萬(wàn)等一直提示你的構(gòu)建正在處理,過(guò)了好一會(huì)你的開(kāi)發(fā)者郵箱就收到了Apple的郵件說(shuō)你的App有問(wèn)題啊,不支持Swift?。?/p>
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.
解決方案
其實(shí)Swift工程有個(gè)坑,就是Swift為了支持之前的OS版本,會(huì)將Swift相關(guān)的lib全部打包到我們的工程中,也就是上面列出來(lái)的libswift相關(guān)的庫(kù),所以你不妨試一下,新建一個(gè)OC的工程和一個(gè)Swift的工程,然后各自打包,OC的才幾百K,Swift的5M,哎,啥都沒(méi)干呢,就感覺(jué)被Swift干了~。這5M就是Swift運(yùn)行時(shí)相關(guān)的lib。那上面Apple告訴我們app里找不到這幾個(gè)庫(kù),其實(shí)是Cocoapods的bug,將我們的Cocoapods更新到目前最新的0.39.0即可。
參考
https://github.com/CocoaPods/CocoaPods/issues/4188
------------------我是可愛(ài)的分割線(xiàn)------------------
以上是博主目前能記得的Swift工程會(huì)遇到的惡心的坑,后續(xù)要是想起來(lái)其他的坑肯定會(huì)上來(lái)填坑,哎,做筆記有多重要,以后感覺(jué)要把自己遇到的每個(gè)bug,每個(gè)坑都記錄下來(lái),定期整理,搞不好還能出本書(shū),哈哈~。
說(shuō)完坑,我們?cè)賮?lái)說(shuō)說(shuō)Swift中 好的 讓人激動(dòng)人心的 Objective-C沒(méi)有的 激起寫(xiě)代碼欲望的(好想修飾詞太多了)的好東西吧。當(dāng)然不是講語(yǔ)法,講Swift語(yǔ)法好的網(wǎng)上一大坨一大坨的,這里要講的是第三方庫(kù)。
RxSwift
玩過(guò)Objective-C的MVVM的同學(xué)肯定知道ReactiveCocoa這個(gè)庫(kù),吊炸天的一個(gè)庫(kù),目前Github上的Star已經(jīng)破萬(wàn)了。那Swift上有沒(méi)有這樣的庫(kù)呢,
當(dāng)然有,那就是RxSwift。
當(dāng)然,ReactiveCocoa現(xiàn)在是4.0版本了,他在3.0版本的時(shí)候就出了Swift版的API,這里并不想討論在Swift工程中那個(gè)庫(kù)更好,stackoverflow上也有人全方位的比較過(guò)著兩個(gè)庫(kù):ReactiveCocoa vs RxSwift - pros and cons,看官們不妨可以移步過(guò)去看一下。
不過(guò)樓主最后還是打算使用RxSwift,畢竟用Swift實(shí)現(xiàn),沒(méi)有歷史包袱,而且RxSwift的文檔和Demo實(shí)在太全面太好了。而且RxSwift是ReactiveX組織推出的,正宗王老吉,正宗好聲音,不是,皇族血統(tǒng),德瑪西亞~
博主是在App發(fā)布后才了解到這個(gè)庫(kù),所以打算在App的下個(gè)版本接入RxSwift,到時(shí)候再分享接入心得給大家。
Neon
Neon是一個(gè)Swift上另辟蹊徑的布局庫(kù)。
Neon沒(méi)有用AutoLayout來(lái)包裝,AutoLayout我就不吐槽了,因?yàn)橐呀?jīng)無(wú)力吐槽了。不過(guò)Swift上有個(gè)庫(kù)叫做Snapkit,是從OC的Masonry演變過(guò)來(lái)的,現(xiàn)在Masonry也歸屬SnapKit組織名下了。不過(guò)Masonry的文檔已經(jīng)寫(xiě)的很清楚了:現(xiàn)在俺們只做bugfix以及合并一些高質(zhì)量的PR,趕緊去看看Snapkit吧??梢?jiàn)Swift在國(guó)外儼然已成主流了。
說(shuō)回Neon,他的語(yǔ)法類(lèi)似描述,非常簡(jiǎn)單,可以有效減小我們布局代碼的行數(shù),不過(guò)個(gè)人感覺(jué)一行代碼略長(zhǎng)。當(dāng)然博主也是從App發(fā)布后才知道這個(gè)庫(kù)的,所以打算在App的下個(gè)版本接入Neon
SQLite.swift
博主本來(lái)是用OC上老牌的FMDB,但是當(dāng)時(shí)FMDB接入Swift2.0工程一直報(bào)錯(cuò),F(xiàn)MDB的作者也一直沒(méi)怎么關(guān)心這件事,可能當(dāng)時(shí)Swift2.0還是Bete的緣故。后來(lái)就接了SQLite.swift,總體來(lái)說(shuō)蠻好用的,可能我的App本身存儲(chǔ)的需求就比較簡(jiǎn)單,不過(guò)我問(wèn)過(guò)SQLite.swift的作者,SQLite.swift是沒(méi)有緩存的,如果你要頻繁操作一個(gè)數(shù)據(jù)庫(kù)中的表數(shù)據(jù)的話(huà),最好自己做一下緩存。
SwiftyUserDefaults
操作NSUserDefaults很麻煩,每次都要寫(xiě)好幾行代碼。SwiftyUserDefaults很好的利用了Swift的語(yǔ)法特性,讓NSUserDefaults的操作達(dá)到了超級(jí)簡(jiǎn)單的水準(zhǔn),比如:
Defaults[colorKey] = "red"
Defaults[colorKey] // => "red", typed as String
恩,領(lǐng)先OC好幾年~
Ji
Ji是一個(gè)HTML/XML解析庫(kù),作者是一位加拿大華人,OC上也有類(lèi)似的庫(kù)hpple,當(dāng)時(shí)作者接入的是hpple,后來(lái)發(fā)現(xiàn)了Ji,就試著接入Ji,然后發(fā)現(xiàn)這兩個(gè)庫(kù)有一個(gè)相同功能的API返回的結(jié)果不同,一問(wèn)才知道是hpple的bug,果斷拋棄hpple,投入Ji的懷抱。那個(gè)bug鏈接
------------------我是第二條可愛(ài)的分割線(xiàn)------------------
好了,接下去我們來(lái)說(shuō)說(shuō)我的App.做iOS開(kāi)發(fā)的都知道國(guó)內(nèi)最大的蘋(píng)果開(kāi)發(fā)者技術(shù)資訊網(wǎng)站CocoaChina.com,可是這個(gè)網(wǎng)站卻沒(méi)有一個(gè)App,AppStore上是有一個(gè)官方的CocoaChina客戶(hù)端app,但是已經(jīng)好幾年沒(méi)有更新了,app里空無(wú)一物,一點(diǎn)數(shù)據(jù)都沒(méi)有。AppStore上也有幾個(gè)第三方開(kāi)發(fā)者做的CocoaChina移動(dòng)端的App,但是他們都有一個(gè)不好的地方就是沒(méi)有做代碼高亮,這樣讓我們看博客文章的時(shí)候很蛋疼,CocoaChina+就解決了這個(gè)問(wèn)題:
CocoaChina+
先說(shuō)一下CocoaChina+相對(duì)于市面上的app的幾個(gè)亮點(diǎn)吧:
1.代碼高亮
目前市面上的第三方的CocoaChina的客戶(hù)端app都沒(méi)有做代碼高亮,包括官方的Wap頁(yè)面。這導(dǎo)致我們?cè)谑謾C(jī)端看博文的時(shí)候一到代碼部分就非常蛋疼。CocoaChina+很好的解決了這個(gè)問(wèn)題,極大的提高了閱讀的體驗(yàn)。
2.流量更省
文章渲染需要的CSS和JS代碼CocoaChina+直接打包進(jìn)了app內(nèi),每次文章加載的時(shí)候就不再需要去服務(wù)端獲取一次了,極大的提高了加載速度,節(jié)省了用戶(hù)的流量。
3.純黑設(shè)計(jì)
整個(gè)app采用純黑色的設(shè)計(jì),程序員都喜歡把自己的編輯器或者IDE界面調(diào)整成黑色,這樣才可以把精力都集中在內(nèi)容上,CocoaChina+的用戶(hù)也基本都是程序員,因此也采用了純黑色的設(shè)計(jì),讓用戶(hù)在閱讀文章的時(shí)候精力更加集中。
4.內(nèi)置聊天室
app內(nèi)部整合了聊天室的功能,開(kāi)發(fā)者可以直接進(jìn)入和其他開(kāi)發(fā)者直接匿名交流。是不是很好玩。
再說(shuō)說(shuō)這個(gè)app后續(xù)版本迭代需要更新的地方:
1.論壇
CocoaChina論壇由于有很多Apple的logo。所以目前App內(nèi)的論壇都把圖片去掉了,目前上線(xiàn)的是一個(gè)簡(jiǎn)單的論壇功能,后續(xù)會(huì)著力更新論壇模塊,CocoaChina的論壇做的還是很牛B的,所以后續(xù)一定會(huì)有一個(gè)很nice的論壇模塊展示在CocoaChina+中
2.登陸
CocoaChina+目前沒(méi)有登錄功能,導(dǎo)致目前論壇上大家還不能直接評(píng)論,這個(gè)后續(xù)也會(huì)更新維護(hù)
3.聊天界面
CocoaChina+的聊天功能是整合了第三方的UI,不是很nice,后續(xù)樓主會(huì)自己用Swift重寫(xiě)一套簡(jiǎn)潔的聊天UI更新上去
3.技術(shù)層面
CocoaChina+是一個(gè)純Swift2.0的項(xiàng)目,用的第三方庫(kù)也是能有Swift的就用Swift,最后才會(huì)考慮Objective-C。后續(xù)也會(huì)對(duì)代碼做一次重構(gòu),整合進(jìn)RxSwift(Swift版的ReactiveCocoa)和Swit上的布局框架Neon。
4.iPad版本
目前app只支持iPhone客戶(hù)端,后續(xù)會(huì)推出iPad客戶(hù)端
最后附上App安裝二維碼
以及部分截圖:
關(guān)于項(xiàng)目開(kāi)源
這個(gè)App是純Swift2.0編寫(xiě)的,目前項(xiàng)目還有很多沒(méi)有上線(xiàn)的功能,部分功能還需要改善,代碼也還需要整理,因此還不打算開(kāi)源。不過(guò)等所有功能都上線(xiàn)了,樓主會(huì)整理下代碼后開(kāi)源到Github。到時(shí)候也會(huì)在App內(nèi)發(fā)Push推送周知大家.不過(guò)這個(gè)過(guò)程可能會(huì)比較漫長(zhǎng),畢竟是個(gè)人項(xiàng)目,只能抽業(yè)余時(shí)間來(lái)做,還請(qǐng)大家耐心等待~
整個(gè)app整合了很多第三方平臺(tái),如友盟,極光推送,Google-Admob,環(huán)信IM等,對(duì)于今后有想做Swift項(xiàng)目的同學(xué)有很大的參考價(jià)值。
希望有一天CocoaChina+會(huì)成為一個(gè)iOS開(kāi)發(fā)者共同維護(hù)的App!