学习SwiftUI两周之后

苹果公司推出SwiftUI已经有小半个月了,当然我也学了有10来天了,一是我真的想学,了解过Web端的童鞋都知道在开发体验上,iOS端差了多少...二是公司的App想用SwiftUI重写,我作为先头部队,就这么出发了.

关于Swift

我是从Swift2开始学习的,其实当时学也没啥太大感受,作为一个还没毕业的实习生,我懂得太少,Swift的好处,缺点我也都看不到.现在Swift已经到5.1了,这么多年走下来,以为个人的感受来说,我学过Java,JS,Python,Go,React...各种语言,框架,但我还是觉得Swift最好(个人观点),虽然说一年学一次新语言有点过分了,但是Swift发展的速度真是肉眼可见,一门新的语言,不稳定,各方面支持都不是很好,这是很正常的,但是我庆幸我能和Swift一起生长,我想如果我现在还在用OC,那我可能有很多思想,框架,思维方式,都不会去了解,也不想去了解.但是Swift很年轻,开源之后社区也很活跃,我每天在其中学习,开阔了我的眼界,让我时刻走在技术发展的前沿,带给我的不仅仅是学了一门语言这么简单.
也正是因为开阔了我的眼界,我才知道了Redux,才知道了前端的开发方式,知道了移动端开发是多么的落后,已经完全跟不上Web的节奏了.正当我要忍无可忍,被MVC这种松散的架构,被Xib,Nib,被时刻要保持数据和UI之间统一的coding方式逼疯的时候,SwiftUI横空出世,我看到它的第一眼,心里是感动,真的,有一种苹果原来还记得我们,一群无助的开发者,一群羡慕前端的却无处诉苦的开发者.让苹果的开发者也可以像Web开发一样,hot reload,声明式的Coding UI的方式,Combine框架带来新的DataFlow,甚至超越了Web的开发体验.所以第二天晚上,我就更新Mac,更新Xcode,学了起来.

SwiftUI的优点

学了差不多有两周的SwiftUI,优点还是很多的
首先,在也不用时刻考虑保持数据和UI的如何同步了,以前,如果一个页面的一个Switch,会hidden一个view,但我们只能添加一个property,在其didset中设置View.isHidden属性,可想而知当页面复杂之后,它是有多么难管理,牵一发动全身,每多出一个UI的State,你都要考虑是否会影响到其它的控件,相信所有的iOS开发都深有体会,90%以上的Bug也都是这么来的.现在在SwiftUI中,我们有了@State,@Binding,@ObjectBinding,@BindableObject,@Environment之后,当一个属性改变之后,与其相关的UI将自动reload,这体验简直不要太爽.
HotReload也是对生产力的重大提升,以往,在发开中,如果想调试某个页面,就必须运行模拟器,如果这个页面很深,再加上项目大了之后,每一次编译都是30s以上,也就意味着你可能就为了调试一个属性,画了1s改了一行代码,但是为了验证这件事,却花了1min,这是多么低的效率,但有了hot reload之后,每次修改之后,Xcode Preview 会自动刷新页面(在不增加property的情况),common + option + p 是我现在最喜欢的快捷键.
声明式的UI是一种和以往开发完全不同的方式,现在的UI开发起来就像是说话一样,我需要一个列表,列表里面有10行,每一个里都有什么数据,说完了,也就写完了.当然这种新的思维方式需要时间去感受,去理解.
Combine作为一个响应式的框架,能带来的不仅仅是UI上的便利,以后它会深入到iOS开发的每个细节,网络,本地化,缓存等各个方面.

使用感受

在学了2周之后,现在给我的感觉就是它并达不到一个能够做出生产级别产品的能力,如果不依靠UIKit,那它能做的事还是很有限,如果按照WWDC上的那套苹果为我们封装好的UI还写,那还是很方便的,但是相信每一家公司都会对自己的产品有自己的理解,这会完完全全的展现在产品的设计上,这就需要工程师做大量的自定义View,在这方面,现在的SwiftUI还很弱,当然,它还小,需要生长.
还有一个方面就是代码的联想速度,应该已经不能用速度来形容了,压根儿就联想不出来.Swift的老毛病,也体现在了Swift UI上了,这一点真的很不爽,因为本来对新的API就不熟悉的情况下,很多东西都需要试出来,但现在试都没法试,而且SwiftUI的API不像是UIKit,你可以在一个控件的class中看到它的属性,现在所有的设置都是用的一个叫modify的东西去做,也就是说你在查看API的时候也不会看到有什么属性,这也导致了我的进度很慢,有时候心态会不太好.
但我相信这只是暂时的,在9月份正式发布之前,苹果一定会将它做的更加完善.

总结

不管怎么说,SwiftUI一定代表着未来苹果的发展方向,其实这也是整个前端的方向,我们必须承认它是好的,SwiftUI已经足够惊艳,我也会继续去学习它,早日把项目替换为SwiftUI+Combine架构的.
最后附上我最近总结的SwiftUI的一些基本用法
https://github.com/RookieNeo/SwiftUIOneStep