以Apple的方式學(xué)SwiftUI:蘋果官方SwiftUI教程一覽

從SwiftUI誕生之日,蘋果就提供了官方的step by step教程。最初的SwiftUI教程(https://developer.apple.com/tutorials/swiftui)是手把手教著做一個名為Landmarks的生活記錄類應(yīng)用。2020年底,蘋果公布了一款新的教程(https://developer.apple.com/tutorials/app-dev-training):一款名為Scrumdinger的小會議管理應(yīng)用。在學(xué)習(xí)了一段時間之后,發(fā)覺Scrumdinger教程似乎更適合初學(xué)者。
簡單來說,這兩款官方教程目的不盡相同。Landmarks教程側(cè)重于展示SwiftUI強(qiáng)大的界面設(shè)計能力,盡可能簡化和抽象程序的“后臺”設(shè)計;Scrumdinger教程被蘋果賦予“iOS App Dev with SwiftUI”的標(biāo)題,因此更側(cè)重于“手把手”教iOS程序開發(fā)。
首先,Landmarks教程比較“老”,截圖使用的是Xcode 12的beta版本(比如View的菜單中沒有最新版中的“Embedded in ZStack”選項(xiàng)),相關(guān)內(nèi)容也是基于SwiftUI 1.0版本。而Scrumdinger教程完全基于SwiftUI 2.0。
真正的iOS應(yīng)用
通過Scrumdinger教程,蘋果想“培養(yǎng)”一批規(guī)范化的iOS開發(fā)者:
規(guī)范使用Swift語法及SwiftUI
規(guī)范化的軟件開發(fā)基本素養(yǎng)
Accessibility友好
譬如,在“Creating a CardView”章節(jié)中,為了更為清晰地展示DailyScrum的model,蘋果給出了DailyScrum的類圖:

但是在教程文本中,蘋果并未提及“類圖(Class Diagram)”這個概念,也沒有提及這里所謂的“model”是“MVC框架”中的一部分。由此可以看出,Scrumdinger教程需要一定的軟件開發(fā)基本知識。
此外,和市面上一些喜歡“炫技”的SwiftUI教程不同,蘋果更注重在構(gòu)建一款功能完整的應(yīng)用基礎(chǔ)上,提供實(shí)用、簡潔且易于開發(fā)的界面,同時提供完整的accessiblity支持。其他教程即使介紹了accessiblity,也往往放在教程后半部分,點(diǎn)到為止。這部教程在第一章就開始指導(dǎo)對界面元素提供完整的accessiblity支持。在之前就有自媒體介紹過iOS系統(tǒng)提供的極其完整且強(qiáng)大的accessiblity功能,iOS提供的“旁白”之類的視覺障礙輔助功能,也需要開發(fā)者在制作應(yīng)用的時候?qū)iT設(shè)置。

因此,跟隨該教程完成所有內(nèi)容之后,所得到的“Scrumdinger”應(yīng)用完全達(dá)到了提交AppStore的標(biāo)準(zhǔn)。
有趣的玩法
在這部教程中,蘋果非常注重“實(shí)用性”。除了常用的UI編寫、數(shù)據(jù)和UI綁定與更新、數(shù)據(jù)處理等方面的基本內(nèi)容,為了增強(qiáng)該應(yīng)用的實(shí)用性,蘋果加入了“Recording Audio”章節(jié)。在這一章中,需要學(xué)習(xí)音頻錄取、音頻轉(zhuǎn)寫文本等內(nèi)容。這些是在市面上一些常見的教程中很少涉獵到的,這些功能的加入也大大提升了“Scrumdinger”這款應(yīng)用的實(shí)用性。
只是SwiftUI
這篇教程雖然構(gòu)建了一個功能全面、實(shí)用性好、界面優(yōu)雅的應(yīng)用,但是也缺乏一些構(gòu)建App必需的內(nèi)容:
沒有網(wǎng)絡(luò)支持
該應(yīng)用沒有使用網(wǎng)絡(luò)API或者常見的對網(wǎng)絡(luò)JSON的使用,也沒有使用iCloud同步數(shù)據(jù)的內(nèi)容。這些基本上是目前構(gòu)建一個完整App需要具備的功能。
缺少對Combine的介紹
SwiftUI搭配Combine框架才足夠強(qiáng)大。雖然不使用Combine框架也能夠完完整整地開發(fā)出App,但是理解了Combine之后對于開發(fā)可謂如虎添翼。對于無處不在的網(wǎng)絡(luò)調(diào)用,使用Combine框架可以更好地處理異步任務(wù)。
最后,happy coding!