前言
6月初,蘋(píng)果WWDC19大會(huì)更新了很多東西魂拦,不過(guò)作為iOS開(kāi)發(fā)人員更關(guān)注的還是SwiftUI、Combine這兩個(gè)庫(kù)。
SwiftUI是類似于Flutter和ReactNative使用Swift開(kāi)發(fā)寫(xiě)出來(lái)的一個(gè)聲明式UI開(kāi)發(fā)框架哮幢。
Combine是類似于RxSwift的響應(yīng)式編程庫(kù)。
雖說(shuō)現(xiàn)在入職公司項(xiàng)目是Objective-C志珍,但是身在曹營(yíng)心在漢橙垢,端午前一天還是第一時(shí)間下載了XCode11,體驗(yàn)了一把伦糯。當(dāng)時(shí)不管怎么弄柜某,蘋(píng)果官方宣稱的那個(gè)預(yù)覽頁(yè)就是出不來(lái)嗽元。后來(lái)又把系統(tǒng)升級(jí)到了10.15,預(yù)覽頁(yè)才顯示出來(lái)喂击。
Combine并沒(méi)有太大的吸引力讓我第一時(shí)間去研究剂癌,畢竟RxSwift在這一方面已經(jīng)做得很6了。
SwiftUI卻是我在受盡了UIKit各種痛點(diǎn)折磨之后夢(mèng)寐以求的庫(kù)翰绊,所以第一時(shí)間看了一遍SwiftUI的各種用法珍手。看完除了各種臥槽的驚嘆中辞做,感覺(jué)還是有太多的可以優(yōu)化的點(diǎn)琳要。
先說(shuō)好處:
第一眼看SwiftUI的時(shí)候,有種似曾相識(shí)的感覺(jué)秤茅,這TM簡(jiǎn)直就是Flutter的翻版稚补。
整個(gè)框架是面向協(xié)議開(kāi)發(fā),基本每個(gè)控件都是Struct框喳,充分發(fā)揮了Swift的特性课幕,同時(shí)可以把任意UIKit控件集成到SwiftUI。
框架整體思想大致和Flutter差不多五垮,都是這種嵌套的形式寫(xiě)法乍惊。每一層小控件可以外面包一層大的控件,好處顯而易見(jiàn)放仗,我可以任意根據(jù)需求堆砌封裝出一個(gè)新的組件润绎。
Color、Image诞挨、Text等等這些全都實(shí)現(xiàn)了View協(xié)議莉撇,也就意味著畫(huà)一個(gè)圓形、設(shè)置一個(gè)背景視圖惶傻、對(duì)圖片做一些處理就跟創(chuàng)建一個(gè)文本一樣簡(jiǎn)單棍郎。多個(gè)Text控件相加就能組成一個(gè)屬性字符串Label控件。雖沒(méi)有深入分析每個(gè)控件银室,但是整體瀏覽完SwiftUI涂佃,對(duì)寫(xiě)UI只有一個(gè)體驗(yàn)就是。蜈敢。自由辜荠。
SwiftUI中數(shù)據(jù)交流采用的是Redux這種單向數(shù)據(jù)流思想、并且提供了@propertyDelegate來(lái)實(shí)現(xiàn)類似于python中的裝飾函數(shù)那種效果扶认。
平時(shí)開(kāi)發(fā)只需要 在數(shù)據(jù)屬性前面加上@State侨拦,即可實(shí)現(xiàn) 每次更改數(shù)據(jù),UI動(dòng)態(tài)更新的效果辐宾。當(dāng)然還有很多類似于@Environment狱从、@ObjectBinding這些沒(méi)有一一去深入研究的膨蛮。
另外為了優(yōu)雅的實(shí)現(xiàn)在閉包中連續(xù)返回多個(gè)View再把這幾個(gè)View封裝成一個(gè)View,蘋(píng)果還新加了一個(gè)@_functionBuilder季研。
再說(shuō)壞處:
每個(gè)新東西出來(lái)都要大量的ren rou測(cè)試 去完善敞葛、去提意見(jiàn)。SwiftUI庫(kù)作為新出的庫(kù)同樣問(wèn)題不少与涡。
SwiftUI可能是為了實(shí)現(xiàn)鏈?zhǔn)骄幊?一鏈到底惹谐,做了大量的類型約束、類型兼容工作驼卖。這就讓很多方法返回類型看起來(lái)很奇怪閱讀性很差氨肌,特別是對(duì)我這種英文不好的開(kāi)發(fā)者。
由于XCode編譯器的原因酌畜,因?yàn)楹芏喾椒ǘ际荲iew協(xié)議的擴(kuò)展怎囚,這就導(dǎo)致寫(xiě)代碼時(shí) 代碼提示一下子出來(lái)幾十個(gè)方法,還有可能設(shè)置了也沒(méi)效果桥胞,很多本身并不需要某些方法的控件也都提示恳守。個(gè)人感覺(jué)這是SwiftUI對(duì)類型約束沒(méi)做好,或者說(shuō)Swift和XCode本身需要一定改進(jìn)贩虾。
讓我印象最深的還是平時(shí)使用肯定最多的Text控件催烘,Text如果是在List中表現(xiàn)其實(shí)還滿意,目前List內(nèi)部是使用UITableView實(shí)現(xiàn)的缎罢。Text設(shè)置lineLimit為0和nil都是不限制行數(shù)伊群,但是設(shè)置成0的時(shí)候抗壓縮能力比較弱,設(shè)置成nil時(shí)抗壓縮能力比較強(qiáng)屁使,這一點(diǎn)不試試還真不知道在岂。感覺(jué)參數(shù)傳成有意義的枚舉可能比單純的Option使用性更強(qiáng)一點(diǎn)。
不過(guò)當(dāng)我把Text控件放到ScrollView控件中且Text比較長(zhǎng)超出一屏的時(shí)候蛮寂,有個(gè)特別懵逼的事情,不管怎么設(shè)置就是沒(méi)法換行易茬,設(shè)置了lineLimit和frame(width:)也還是顯示一行酬蹋。不知道是哪里的設(shè)置姿勢(shì)不對(duì),小小的邊界自動(dòng)換行或者指定寬度自動(dòng)換行需求把我難到了抽莱。
最后:
SwiftUI雖然iOS13才能用范抓,不過(guò)庫(kù)里面涉及到很多的設(shè)計(jì)理念,的確是讓人耳目一新食铐。即使短期內(nèi)用不了匕垫,相信也會(huì)對(duì)iOS開(kāi)發(fā)圈子造成很大的沖擊力。只要幾年后SwiftUI入主正宮虐呻,之前為了解決UIKit各種痛點(diǎn)而橫空出世的庫(kù)象泵,相信都可以不用了寞秃。
RxSwift可以用Combine代替,ReSwift或者其他單向數(shù)據(jù)流庫(kù)也可以扔掉了偶惠。那些動(dòng)畫(huà)庫(kù)在SwiftUI簡(jiǎn)易的動(dòng)畫(huà)創(chuàng)建方式下也再?zèng)]有神秘感春寿。那些靜態(tài)表單庫(kù)或者數(shù)據(jù)流驅(qū)動(dòng)Table局部更新的庫(kù)也可以扔掉了,因?yàn)長(zhǎng)ist默認(rèn)支持靜態(tài)和動(dòng)態(tài)cell結(jié)合忽孽。不知道何時(shí)蘋(píng)果能出一套使用簡(jiǎn)單的Swift思想開(kāi)發(fā)的網(wǎng)絡(luò)請(qǐng)求框架绑改。
幾年后無(wú)論蘋(píng)果還在不在,感覺(jué)聲明式UI框架一定會(huì)成為主流兄一。