前言
6月初,苹果WWDC19大会更新了很多东西,不过作为iOS开发人员更关注的还是SwiftUI、Combine这两个库。
SwiftUI是类似于Flutter和ReactNative使用Swift开发写出来的一个声明式UI开发框架。
Combine是类似于RxSwift的响应式编程库。
虽说现在入职公司项目是Objective-C,但是身在曹营心在汉,端午前一天还是第一时间下载了XCode11,体验了一把。当时不管怎么弄,苹果官方宣称的那个预览页就是出不来。后来又把系统升级到了10.15,预览页才显示出来。
Combine并没有太大的吸引力让我第一时间去研究,毕竟RxSwift在这一方面已经做得很6了。
SwiftUI却是我在受尽了UIKit各种痛点折磨之后梦寐以求的库,所以第一时间看了一遍SwiftUI的各种用法。看完除了各种卧槽的惊叹中,感觉还是有太多的可以优化的点。
先说好处:
第一眼看SwiftUI的时候,有种似曾相识的感觉,这TM简直就是Flutter的翻版。
整个框架是面向协议开发,基本每个控件都是Struct,充分发挥了Swift的特性,同时可以把任意UIKit控件集成到SwiftUI。
框架整体思想大致和Flutter差不多,都是这种嵌套的形式写法。每一层小控件可以外面包一层大的控件,好处显而易见,我可以任意根据需求堆砌封装出一个新的组件。
Color、Image、Text等等这些全都实现了View协议,也就意味着画一个圆形、设置一个背景视图、对图片做一些处理就跟创建一个文本一样简单。多个Text控件相加就能组成一个属性字符串Label控件。虽没有深入分析每个控件,但是整体浏览完SwiftUI,对写UI只有一个体验就是。。自由。
SwiftUI中数据交流采用的是Redux这种单向数据流思想、并且提供了@propertyDelegate来实现类似于python中的装饰函数那种效果。
平时开发只需要 在数据属性前面加上@State,即可实现 每次更改数据,UI动态更新的效果。当然还有很多类似于@Environment、@ObjectBinding这些没有一一去深入研究的。
另外为了优雅的实现在闭包中连续返回多个View再把这几个View封装成一个View,苹果还新加了一个@_functionBuilder。
再说坏处:
每个新东西出来都要大量的ren rou测试 去完善、去提意见。SwiftUI库作为新出的库同样问题不少。
SwiftUI可能是为了实现链式编程 一链到底,做了大量的类型约束、类型兼容工作。这就让很多方法返回类型看起来很奇怪阅读性很差,特别是对我这种英文不好的开发者。
由于XCode编译器的原因,因为很多方法都是View协议的扩展,这就导致写代码时 代码提示一下子出来几十个方法,还有可能设置了也没效果,很多本身并不需要某些方法的控件也都提示。个人感觉这是SwiftUI对类型约束没做好,或者说Swift和XCode本身需要一定改进。
让我印象最深的还是平时使用肯定最多的Text控件,Text如果是在List中表现其实还满意,目前List内部是使用UITableView实现的。Text设置lineLimit为0和nil都是不限制行数,但是设置成0的时候抗压缩能力比较弱,设置成nil时抗压缩能力比较强,这一点不试试还真不知道。感觉参数传成有意义的枚举可能比单纯的Option使用性更强一点。
不过当我把Text控件放到ScrollView控件中且Text比较长超出一屏的时候,有个特别懵逼的事情,不管怎么设置就是没法换行,设置了lineLimit和frame(width:)也还是显示一行。不知道是哪里的设置姿势不对,小小的边界自动换行或者指定宽度自动换行需求把我难到了。
最后:
SwiftUI虽然iOS13才能用,不过库里面涉及到很多的设计理念,的确是让人耳目一新。即使短期内用不了,相信也会对iOS开发圈子造成很大的冲击力。只要几年后SwiftUI入主正宫,之前为了解决UIKit各种痛点而横空出世的库,相信都可以不用了。
RxSwift可以用Combine代替,ReSwift或者其他单向数据流库也可以扔掉了。那些动画库在SwiftUI简易的动画创建方式下也再没有神秘感。那些静态表单库或者数据流驱动Table局部更新的库也可以扔掉了,因为List默认支持静态和动态cell结合。不知道何时苹果能出一套使用简单的Swift思想开发的网络请求框架。
几年后无论苹果还在不在,感觉声明式UI框架一定会成为主流。