蘋(píng)果開(kāi)發(fā)者大會(huì) WWDC 2019 在北京開(kāi)幕。在這場(chǎng)大會(huì)上除了「史上最難看 Mac 主機(jī)」工禾、首次出現(xiàn)的
iPadOS
以外运提,我們還終于可以對(duì)飽受詬病的iTunes
說(shuō)再見(jiàn)了蝗柔。而對(duì)于開(kāi)發(fā)者來(lái)說(shuō),新發(fā)布的 SwiftUI 可能是最吸引人的特性民泵,在 蘋(píng)果公司軟件工程高級(jí)副總裁Craig Federighi
的演示中癣丧,我們可以輕松地把一百行的前端代碼縮減到十幾行。
作為一個(gè)開(kāi)發(fā)者栈妆,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要胁编,這是一個(gè)我的iOS開(kāi)發(fā)交流群:130595548,不管你是小白還是大牛都?xì)g迎入駐 鳞尔,讓我們一起進(jìn)步嬉橙,共同發(fā)展!(群內(nèi)會(huì)免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書(shū)籍資料以及整理好的幾百道面試題和答案文檔A燃佟)
下面來(lái)一張牛逼哄哄的SwiftUI
效果圖市框,給大家打打牙祭
- 初體驗(yàn):左邊加大括號(hào)21行,右邊出現(xiàn)一些類(lèi)似SB的東西昧旨,布局UI,設(shè)置屬性貌似都可以完成
SwiftUI 的特點(diǎn)是什么
SwiftUI 使用聲明式語(yǔ)法祥得,所以我們可以簡(jiǎn)單地聲明用戶(hù)界面的樣式兔沃。
- 開(kāi)發(fā)者可以聲明需要由一串文本輸入框構(gòu)成的組件
- 然后定義每一個(gè)輸入框的字體對(duì)齊方式、字體樣式级及、字體顏色乒疏。
- 這些代碼比以往更加易懂,省時(shí)并易于維護(hù)饮焦。
這種聲明式的方式甚至允許使用復(fù)雜的功能怕吴,如動(dòng)畫(huà)(animation)。只需要幾行代碼县踢,即可添加動(dòng)畫(huà)在任何控件上转绷,并且可以使用易于調(diào)用的特效。在運(yùn)行時(shí)硼啤,SwifthUI 會(huì)自行控制創(chuàng)建流暢動(dòng)作的所有步驟议经,并且可以解決程序沖突,保證 app 穩(wěn)定運(yùn)行谴返。動(dòng)畫(huà)特效變得如此容易煞肾,我們可以發(fā)掘使 app 更加靈動(dòng)的方式。
為什么需要 SwiftUI
下面是來(lái)自王巍對(duì)UIKit
的詬病
UIKit
提供的是一套符合直覺(jué)的嗓袱,基于控制流的命令式的編程方式籍救。最主要的思想是在確保View
或者View Controller
生命周期以及用戶(hù)交互時(shí),相應(yīng)的方法 (比如viewDidLoad
或者某個(gè)target-action
等) 能夠被正確調(diào)用渠抹,從而構(gòu)建用戶(hù)界面和邏輯蝙昙。不過(guò)闪萄,不管是從使用的便利性還是穩(wěn)定性來(lái)說(shuō),UIKit 都面臨著巨大的挑戰(zhàn)耸黑。我個(gè)人勉強(qiáng)也能算是iOS
開(kāi)發(fā)的“老司機(jī)”了桃煎,但是掉到 UIKit 的坑里這件事,也幾乎還是我每天的日常大刊。UIKit
的基本思想要求View Controller
承擔(dān)絕大部分職責(zé)为迈,它需要協(xié)調(diào)model,view
以及用戶(hù)交互缺菌。這帶來(lái)和巨大的side effect
以及大量的狀態(tài)葫辐,如果沒(méi)有妥善安置,它們將在View Controller
中混雜在一起伴郁,同時(shí)作用于view
或者邏輯耿战,從而使?fàn)顟B(tài)管理愈發(fā)復(fù)雜,甚至不可維護(hù)焊傅。不僅是用戶(hù)代碼剂陡,UIKit
本身內(nèi)部也經(jīng)常受困于可變狀態(tài),各種奇怪的bug
也頻頻出現(xiàn)狐胎。
的確鸭栖,我們平時(shí)開(kāi)發(fā)很多的時(shí)間都浪費(fèi)在了這個(gè)方面,然而作為牛逼的握巢,我也相信必然會(huì)一統(tǒng)江湖的 Swift
也是不忍心讓開(kāi)發(fā)人員掉入這樣的坑中晕鹊,SwiftUI
只是一個(gè)開(kāi)始---打開(kāi)新世界的開(kāi)始
聲明式語(yǔ)法
SwiftUI 使用了聲明式語(yǔ)法,所以開(kāi)發(fā)者能夠十分輕易地描述用戶(hù)界面應(yīng)該做什么暴浦。例如溅话,編寫(xiě)需要包含文本字段的項(xiàng)目列表時(shí),開(kāi)發(fā)者可以用代碼描述每個(gè)字段的對(duì)齊方式歌焦、字體和顏色飞几。代碼也比以前更簡(jiǎn)單,更易于閱讀独撇。
這種聲明式風(fēng)格非常適用于像動(dòng)畫(huà)這樣復(fù)雜的元素循狰。通過(guò) SwiftUI,開(kāi)發(fā)者可輕松地將動(dòng)畫(huà)添加到幾乎任何控件券勺。
擁有更直觀的新設(shè)計(jì)工具
Xcode 11 包含更直觀的新設(shè)計(jì)工具绪钥,可讓開(kāi)發(fā)者通過(guò)拖拽的方式使用 SwiftUI 構(gòu)建界面,在這過(guò)程中可以直接設(shè)置控件的相關(guān)屬性关炼。
當(dāng)在設(shè)計(jì)工具中工作時(shí)程腹,所編輯的內(nèi)容會(huì)立刻反映到代碼上,如果從模擬器切換到手機(jī)儒拂,手機(jī)也能立馬看到預(yù)覽效果寸潦。
為所有的蘋(píng)果設(shè)備提供原生體驗(yàn)
SwiftUI 是真正的原生 UI 框架色鸳,建立在蘋(píng)果數(shù)十年打磨用戶(hù)界面的經(jīng)驗(yàn)上。開(kāi)發(fā)者通過(guò)少量代碼和交互式設(shè)計(jì)就能使用這個(gè)框架见转。
SwiftUI 示例代碼
為視圖的任何狀態(tài)聲明內(nèi)容和布局命雀。SwiftUI知道該狀態(tài)何時(shí)發(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ù)雜的接口乘客。在為任何蘋(píng)果平臺(tái)設(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))
}
}
- 簡(jiǎn)便的動(dòng)畫(huà)創(chuàng)建方式
創(chuàng)建平滑的動(dòng)畫(huà)就像添加一個(gè)方法調(diào)用一樣簡(jiǎn)單。SwiftUI在需要時(shí)自動(dòng)計(jì)算和動(dòng)畫(huà)轉(zhuǎn)換易核。
VStack {
Badge()
.frame(width: 300, height: 300)
.animation(.basic())
Text(name)
.font(.title)
.animation(Animation.basic().delay(0.25))
}
SwiftUI 支持的設(shè)備要求版本較高匈织,在開(kāi)啟公測(cè),官方介紹如下:
iOS 13.0+ Beta macOS 10.15+ Beta UIKit for Mac 13.0+ Beta tvOS 13.0+ Beta watchOS 6.0+ Bet