前段时间博主从阿里巴巴跳槽加盟滴滴快的,乘着跳槽的时间差作了两件一直想作的事:
一件就是用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!