蘋果開發(fā)者大會 WWDC 2019 在北京時間今天凌晨開幕袱瓮。在這場大會上除了「史上最難看 Mac 主機(jī)」、首次出現(xiàn)的
iPadOS
以外爱咬,我們還終于可以對飽受詬病的iTunes
說再見了尺借。而對于開發(fā)者來說,新發(fā)布的 SwiftUI 可能是最吸引人的特性台颠,在 蘋果公司軟件工程高級副總裁Craig Federighi
的演示中褐望,我們可以輕松地把一百行的前端代碼縮減到十幾行。
下面來一張牛逼哄哄的SwiftUI
效果圖串前,給大家打打牙祭
- 初體驗(yàn):左邊加大括號21行瘫里,右邊出現(xiàn)一些類似SB的東西,布局UI荡碾,設(shè)置屬性貌似都可以完成
SwiftUI 的特點(diǎn)是什么
SwiftUI 使用聲明式語法谨读,所以我們可以簡單地聲明用戶界面的樣式。
- 開發(fā)者可以聲明需要由一串文本輸入框構(gòu)成的組件
- 然后定義每一個輸入框的字體對齊方式坛吁、字體樣式劳殖、字體顏色。
- 這些代碼比以往更加易懂拨脉,省時并易于維護(hù)哆姻。
這種聲明式的方式甚至允許使用復(fù)雜的功能,如動畫(animation)玫膀。只需要幾行代碼矛缨,即可添加動畫在任何控件上,并且可以使用易于調(diào)用的特效帖旨。在運(yùn)行時箕昭,SwifthUI 會自行控制創(chuàng)建流暢動作的所有步驟,并且可以解決程序沖突解阅,保證 app 穩(wěn)定運(yùn)行落竹。動畫特效變得如此容易,我們可以發(fā)掘使 app 更加靈動的方式货抄。
為什么需要 SwiftUI
下面是來自王巍對UIKit
的詬病
UIKit
提供的是一套符合直覺的述召,基于控制流的命令式的編程方式朱转。最主要的思想是在確保View
或者View Controller
生命周期以及用戶交互時,相應(yīng)的方法 (比如viewDidLoad
或者某個target-action
等) 能夠被正確調(diào)用桨武,從而構(gòu)建用戶界面和邏輯肋拔。不過,不管是從使用的便利性還是穩(wěn)定性來說呀酸,UIKit 都面臨著巨大的挑戰(zhàn)。我個人勉強(qiáng)也能算是iOS
開發(fā)的“老司機(jī)”了琼梆,但是掉到 UIKit 的坑里這件事性誉,也幾乎還是我每天的日常。UIKit
的基本思想要求View Controller
承擔(dān)絕大部分職責(zé)茎杂,它需要協(xié)調(diào)model错览,view
以及用戶交互。這帶來和巨大的side effect
以及大量的狀態(tài)煌往,如果沒有妥善安置倾哺,它們將在View Controller
中混雜在一起,同時作用于view
或者邏輯刽脖,從而使?fàn)顟B(tài)管理愈發(fā)復(fù)雜羞海,甚至不可維護(hù)。不僅是用戶代碼曲管,UIKit
本身內(nèi)部也經(jīng)常受困于可變狀態(tài)却邓,各種奇怪的bug
也頻頻出現(xiàn)。
的確院水,我們平時開發(fā)很多的時間都浪費(fèi)在了這個方面腊徙,然而作為牛逼的,我也相信必然會一統(tǒng)江湖的 Swift
也是不忍心讓開發(fā)人員掉入這樣的坑中檬某,SwiftUI
只是一個開始---打開新世界的開始
聲明式語法
SwiftUI 使用了聲明式語法撬腾,所以開發(fā)者能夠十分輕易地描述用戶界面應(yīng)該做什么。例如恢恼,編寫需要包含文本字段的項(xiàng)目列表時民傻,開發(fā)者可以用代碼描述每個字段的對齊方式、字體和顏色厅瞎。代碼也比以前更簡單饰潜,更易于閱讀。
這種聲明式風(fēng)格非常適用于像動畫這樣復(fù)雜的元素和簸。通過 SwiftUI彭雾,開發(fā)者可輕松地將動畫添加到幾乎任何控件。
擁有更直觀的新設(shè)計(jì)工具
Xcode 11 包含更直觀的新設(shè)計(jì)工具锁保,可讓開發(fā)者通過拖拽的方式使用 SwiftUI 構(gòu)建界面薯酝,在這過程中可以直接設(shè)置控件的相關(guān)屬性半沽。
當(dāng)在設(shè)計(jì)工具中工作時,所編輯的內(nèi)容會立刻反映到代碼上吴菠,如果從模擬器切換到手機(jī)者填,手機(jī)也能立馬看到預(yù)覽效果。
為所有的蘋果設(shè)備提供原生體驗(yàn)
SwiftUI 是真正的原生 UI 框架做葵,建立在蘋果數(shù)十年打磨用戶界面的經(jīng)驗(yàn)上占哟。開發(fā)者通過少量代碼和交互式設(shè)計(jì)就能使用這個框架。
SwiftUI 示例代碼
為視圖的任何狀態(tài)聲明內(nèi)容和布局酿矢。SwiftUI知道該狀態(tài)何時發(fā)生變化榨乎,并更新視圖的呈現(xiàn)以匹配該狀態(tài)。
List(landmarks) { landmark in
HStack {
Image(landmark.thumbnail)
Text(landmark.name)
Spacer()
if landmark.isFavorite {
Image(systemName: "star.fill")
.foregroundColor(.yellow)
}
}
}
- 構(gòu)建可復(fù)用的組件
將小的瘫筐、單一職責(zé)的視圖組合成更大蜜暑、更復(fù)雜的接口。在為任何蘋果平臺設(shè)計(jì)的應(yīng)用程序之間共享自定義視圖策肝。
struct FeatureCard: View {
var landmark: Landmark
var body: some View {
landmark.featureImage
.resizable()
.aspectRatio(3/2, contentMode: .fit)
.overlay(TextOverlay(landmark))
}
}
- 簡便的動畫創(chuàng)建方式
創(chuàng)建平滑的動畫就像添加一個方法調(diào)用一樣簡單肛捍。SwiftUI在需要時自動計(jì)算和動畫轉(zhuǎn)換。
VStack {
Badge()
.frame(width: 300, height: 300)
.animation(.basic())
Text(name)
.font(.title)
.animation(Animation.basic().delay(0.25))
}
SwiftUI 支持的設(shè)備要求版本較高之众,將在7月份開啟公測拙毫,官方介紹如下:
iOS 13.0+ Beta
macOS 10.15+ Beta
UIKit for Mac 13.0+ Beta
tvOS 13.0+ Beta
watchOS 6.0+ Bet
推薦學(xué)習(xí)
拓展參考資料: