Learn SwiftUI in a Swift Way:市面常見SwiftUI教程排雷

蘋果在2019年發(fā)布了SwiftUI,正式給自家應(yīng)用開發(fā)生態(tài)引入了聲明式UI。隨著iOS 14和macOS Big Sur的正式發(fā)布,SwiftUI也正式進(jìn)入了“2.0”時代。相比于第一代,2020年版本的SwiftUI進(jìn)一步剝離了與傳統(tǒng)UIKit之間的關(guān)系,提供了更多組件,并提供了更為完善的全平臺支持。
事實上,這個所謂的“SwiftUI 2.0”版本才可以說是真正比較成熟,開發(fā)者也終于能放開手腳去開發(fā)應(yīng)用。在蘋果的生態(tài)中,SwiftUI是構(gòu)建系統(tǒng)界面“唯一的”未來,新版本的很多系統(tǒng)特性蘋果只提供了利用SwiftUI的解決方案,譬如iOS 14引入的Widget桌面小組件。
所以無論喜歡與否,SwiftUI是未來,至少是蘋果希望的未來。先分享一下自己學(xué)習(xí)時候踩過的坑。
一時的美好
SwiftUI != 界面漂亮
SwiftUI只是提供了一種完全不同于傳統(tǒng)Storyboard的界面構(gòu)建方式,利用代碼來更為精細(xì)地控制界面元素。這些控件依然是基于iOS本身,只是可以更為方便地被自定義。
事實上,市面上很多介紹SwiftUI的教程和應(yīng)用都提供了漂亮的界面,有著舒適的圓角和布局,各種炫酷的動畫過渡和陰影效果。其實這些更多已經(jīng)超出了“用SwiftUI編寫應(yīng)用”這個命題,而是拓展到了“用SwiftUI”去完成一項界面交互設(shè)計。

大多數(shù)的情況是,當(dāng)學(xué)完很多基本的SwiftUI教程之后,會發(fā)現(xiàn)自己“畫”出來的界面依然看著不是那么漂亮。這時候,除了提高自己審美素養(yǎng)之外,那就只能——學(xué)設(shè)計!
SwiftUI無所不能
作為新發(fā)布的框架,SwiftUI依然還有很多不成熟的地方,一些效果可能還無法方便地直接通過SwiftUI來實現(xiàn),系統(tǒng)所提供的原生SwiftUI組件也不夠充足。
譬如在iOS 13中新增的PencilKit相關(guān)API,可以讓開發(fā)者極為方便地創(chuàng)建筆跡相關(guān)功能,但是PencilKit的核心Canvas(畫布)組件并不能直接在SwiftUI中調(diào)用,依然需要將其封裝一下:通過SwiftUI提供的UIViewRepresentable
協(xié)議來封裝CanvasView
,并且實現(xiàn)makeUIView(context:)
和updateUIView(_:context:)
方法。

可以預(yù)見,在之后幾個大版本的SwiftUI更新中,蘋果會著力補(bǔ)全這些系統(tǒng)原生組件,并提供更為完善的自定義能力。但目前,SwiftUI依然有一些限制,需要開發(fā)者采用一些workround。另外,在目前macOS Big Sur系統(tǒng)上,SwiftUI的bug更多。
SwiftUI發(fā)展很快
SwiftUI一經(jīng)推出,就受到了熱烈關(guān)注。
但是經(jīng)過一年半的沉淀之后,SwiftUI關(guān)注度并沒有那么高了,或者說,并沒有掀起蘋果生態(tài)圈的巨浪。
從Google Trends統(tǒng)計來看,SwiftUI的熱度往往集中在WWDC附近兩個月。從網(wǎng)上可以獲得的書籍和教程來看,并沒有出現(xiàn)“井噴”。

最大的原因是SwiftUI有點“生不逢時”:移動互聯(lián)網(wǎng)應(yīng)用開發(fā)大熱潮已經(jīng)退去。現(xiàn)在已經(jīng)鮮有像7、8年前那樣,憑借一款手機(jī)應(yīng)用就覺得可以“change the world”,或者最起碼可以“顛覆業(yè)界”;在如今市場極度細(xì)分和成熟的環(huán)境下,每一個公司在移動應(yīng)用開發(fā)都積累了足夠龐大的基礎(chǔ)框架和代碼庫,除非蘋果一刀切不允許使用UIKit的應(yīng)用上架,否則很少會有廠家會考慮用SwiftUI來替代現(xiàn)有的成熟開發(fā)體系。
所以SwiftUI發(fā)展就遇到了一個很尷尬的情景:蘋果用力在推動,所有人都覺得是注定的未來,但真的敢于吃螃蟹的人卻比較少。個人開發(fā)者自然可以使用SwiftUI來提高開發(fā)效率,可對于分工已經(jīng)極其細(xì)化的大公司來說,轉(zhuǎn)到SwiftUI并沒有太多看得見的好處:既不能顯著提升開發(fā)效率,還要承擔(dān)新框架所帶來的不穩(wěn)定、bug多、開發(fā)人員不熟悉、社區(qū)和文檔支持少等問題。
Why SwiftUI?
對于個人開發(fā)者來說,SwiftUI絕對是可以提升開發(fā)效率的必學(xué)之路。SwiftUI提供了更為簡便和快捷的設(shè)計界面方法,并可以更方便地預(yù)覽;同時提供了蘋果全平臺的跨平臺能力。SwiftUI是蘋果欽定的未來,隨著Swift語言的進(jìn)一步成熟,SwiftUI注定會用起來更舒服(Xcode不一定會更舒服……這個年代代碼高亮都能崩的IDE,也只有這么一個了……)
SwiftUI不僅僅適合開發(fā)者,其強(qiáng)大而又簡潔的功能很適合設(shè)計師來制作應(yīng)用原型,甚至做一些demo。
那么,學(xué)SwiftUI哪家強(qiáng)?接下來分享一下學(xué)習(xí)感受。
Design+Code的SwiftUI教程
Design+Code的SwiftUI教程應(yīng)該可以說是市面上最“漂亮”的。與其說這是一部應(yīng)用開發(fā)教程,不如說是利用SwiftUI進(jìn)行應(yīng)用設(shè)計的教學(xué)。Step by step學(xué)下來,會做出一款非常有設(shè)計感的應(yīng)用:優(yōu)美的UI設(shè)計、炫酷流暢的動畫、富有親和力的交互。

這款教程非常“專一”:只是圍繞SwiftUI展開,并沒有過多的拓展。常見的網(wǎng)絡(luò)API使用、JSON處理、并發(fā)、新的Combine框架、數(shù)據(jù)存儲等知識點,都沒有在教程中涉及。這款教程只是用最炫酷的方式在展現(xiàn)SwiftUI的強(qiáng)大能力。這款教程非常適合想了解SwiftUI的設(shè)計師;對于開發(fā)者來說,可以用來了解SwiftUI的基本能力,并學(xué)習(xí)感悟其UX設(shè)計技巧,而剩下的那些“界面背后”的“龐然大物”,需要用其他教程去彌補(bǔ)。
Hacking with Swift的教程
Hacking with Swift的教程可謂包羅萬象,很難想象一個人(Paul Hudson)可以獨立完成這么多教程和書籍。這個網(wǎng)站可謂是蘋果開發(fā)寶庫,幾乎提供了各平臺的各種水平的教程,并且還有大量的免費(fèi)視頻。作者極其勤勞,馬不停蹄地更新,而且是面面俱到地更新:一些老教程會及時得到更新以匹配蘋果新的API。

這個系列的教程是完全從開發(fā)者角度出發(fā),沒有過于炫技的UI和動畫,但能將蘋果生態(tài)中應(yīng)用開發(fā)所需基本技能都傳授過來。作者在Twitter上也極其活躍,可以很方便的與其交流,并對教程提出建議。
當(dāng)然,由于要維護(hù)這么龐大的教程庫,作者一人如今顯得有點“忙不過來”,尤其是體現(xiàn)在書籍更新上,SwiftUI的2.0版本已經(jīng)更新了半年,作者依然還在挖新坑,一些SwiftUI 1.0時代的書籍還沒有及時更新……當(dāng)然作者也承諾終身免費(fèi)更新。

事實上,配合上Design+Code所提供的界面設(shè)計教程,基本上已經(jīng)完成了SwiftUI應(yīng)用開發(fā)的學(xué)習(xí)閉環(huán)。
SwiftUI Masterclass
SwiftUI Masterclass是在Udemy上的課程。也是一位比較勤快的講師,能隨著新API不斷更新課程。課程在提供了比較全面的應(yīng)用開發(fā)知識基礎(chǔ)上,非常注重界面設(shè)計,每個小節(jié)制作的應(yīng)用看起來都非常舒服。不同于Design+Code的“純界面”教學(xué),這個課程還涉及到了SwiftUI和應(yīng)用開發(fā)一些必備的技能:JSON處理、Core Data、跨平臺開發(fā)等,作者還在不斷增加新的內(nèi)容。目前來看教程依然缺乏常見的網(wǎng)絡(luò)API使用、多線程和Combine框架等內(nèi)容。

講師在Twitter上也很活躍,也積極聆聽各方建議,不斷完善教程。
SwiftUI – Declarative Interfaces for any Apple Device

SwiftUI – Declarative Interfaces for any Apple Device也是Udemy上比較熱門的課程。這款課程非常全面,近期也更新了SwiftUI 2.0的各項內(nèi)容。這款課程以知識點為中心,用比較簡單的程序來展示幾個重點方面的內(nèi)容,而不過于拘泥于制作一款好看且好用的應(yīng)用。究其原因,是因為這個課程中一部分是免費(fèi)放在YouTube上的,因此講師往往希望用簡短的視頻和簡單的應(yīng)用來重點講解某些功能點。
ObjC.io相關(guān)教程


在ObjC.io及其中文網(wǎng)站上,擁有一些不錯的SwiftUI教程:《Thinking in SwiftUI(SwiftUI編程思想)》和《SwiftUI與Combine編程》。不過這兩個教程更適合有一定Swift和SwiftUI開發(fā)基礎(chǔ)的讀者。
其他
此外還有很多書籍和教程。老牌教程網(wǎng)站raywenderlich上有視頻和教程,但個人不太喜歡這個網(wǎng)站過于零碎的教學(xué)風(fēng)格。Stanford有相關(guān)的課程,非常適合大學(xué)生開展系統(tǒng)化的學(xué)習(xí)。書籍大部分還沒有更新到SwiftUI 2.0,因此不過多推薦了。

最后,提一下Big Mountain Studio的系列教程,可謂是“百科全書”級別的SwiftUI范例大全。當(dāng)想用SwiftUI寫出一點有“設(shè)計感”的界面卻不知如何下手的時候,或者不知道寫出來的樣式是不是“優(yōu)解”,可以參考一下這些教程。

寫在最后
“爺爺,你關(guān)注的Up主更新了!”
好久不見,甚是想念。
近年來由于“沉溺”打工,Augix頻道產(chǎn)量急速下降,一年更新一次也不是夢。
生活,不僅有堅持的過程,也有妥協(xié)的無奈,套用《武林外傳》中的臺詞:這就是生活,無情、無恥、無理取鬧的生活。
可是生活也是豐富多彩的,Augix,只要堅持,只要“擠擠”,什么都還是會有的。
每個人都在尋求生活、學(xué)習(xí)、工作的平衡點,除了研究數(shù)碼,Augix頻道總想夾雜一些“私貨”:讓每個人的生活簡單、精彩、有趣。為了達(dá)到這個目的,Augix頻道想記錄更多,想提供更多。
在Augix的官網(wǎng)augix.me上,除了數(shù)碼的使用體驗和技巧,還有一些生活小品、學(xué)習(xí)資料。舉例來說,在國內(nèi),SwiftUI不溫不火,正常公司開發(fā)App基本不會考慮使用SwiftUI,但對于依然想在蘋果平臺上開發(fā)屬于自己的小應(yīng)用的同志們來說,SwiftUI極大提高了開發(fā)效率(當(dāng)然由于各種bug和feature的不全,提高倍數(shù)大打折扣),也是蘋果堅持的未來。
“《在B站發(fā)這么長的文字還想讓人看到最后,一定是搞錯了什么》輕小說絕贊發(fā)售中……”
語無倫次說了這么多,也是想傳達(dá)在這個人人都可以做視頻的時代,給大家看一點不太一樣的內(nèi)容。沉下心來讀一本書,或者連續(xù)幾個月學(xué)習(xí)一項技術(shù),也許真的沒有那么“有用”,可能最后卻真的可以沉淀下一些東西。
最后,向大家匯報一下作為Augix主筆之一——Majirefy的近期動態(tài):①學(xué)習(xí)SwiftUI,想寫一個小應(yīng)用;②背誦毛教員的詩詞。
SwiftUI真的好玩,但是坑也不少,經(jīng)常遇到代碼明明和教程一摸一樣,就是沒辦法build或者preview的情況,刪掉文件重新復(fù)制粘貼一次莫名其妙又好了……可能在自己心里,發(fā)布一款屬于自己的應(yīng)用或者游戲,就想是生一個小孩一樣有成就感和幸福感吧。
毛教員的詩詞非常好,大氣磅礴,很喜歡。購買的是人民文學(xué)出版社新修訂的版本,主編吳正裕,這也是目前最權(quán)威、最全面、最準(zhǔn)確的版本,如果喜歡毛教員詩詞的,一定要入手這個版本。
接下來,考慮到工作、生活和學(xué)習(xí)的平衡,Augix可能依然采用文字為主的方式來發(fā)布內(nèi)容,當(dāng)然這種方式傳播度和效果非常差,能耐心看下來的伙伴兒們,鞠躬,感謝!