Apple 的產品對於我而言,軟體比硬體更有吸引力。如果說硬體是打基礎的話,軟體則是裝修。硬體是天花板,但沒有軟體一切都等於 0 。昨天晚上看 WWDC2019 看到 3 點半,除了tvOS 以外,每個 OS 都給了我眼前一亮的感覺,像 macOS 的 Sidecar ( RIP Duet Display ),iOS 的 Darkmode, ARkit3 ,watchOS 的噪音檢測,全新的 「watch Store」,以及全新的 ipadOS 系統。這些都是 Apple 為用戶們優化的體驗,似乎開發者還是以前的開發者,除了新增了幾個 API 以外。但是,今年的 WWDC 大會主題是 「Write code. Blow minds.」,WWDC 也果然還是一個開發者大會,隨即發布的 Project Catalyst 以及 SwiftUI 徹底點燃了整個會場。整個 2 個半小時下來,最讓我有感覺的,還是 SwiftUI 。

SwiftUI 給我們帶來了什麼

1.聲明性語法 ( Declarative Syntax )

與 UIkit 不同,SwiftUI 用聲明性的語法來很簡單的聲明界面的邏輯。比如說如果你想寫一個列表的話,使用 SwiftUI 一切都可以在代碼裡面單獨進行聲明,包括間距,字體,顏色,甚至動畫等等。

import SwiftUI

struct Content : View {

@state var model = Themes.listModel

var body: some View {
List(model.items, action: model.selectItem) { item in
Image(item.image)
Vstack(alignment: .lending) {
Text(item.title)
Text(item.subtitle)
.color(.gray)
}
}
}
}

上面這幾行代碼就描述了一個列表,我不知道你們的感覺是什麼,我第一眼看到這幾行代碼,有種看 CSS 的感覺。從這幾行寫列表的代碼來看,主要的工作都是描述控制項的內容,這對寫代碼的人以及讀代碼的人都是極好的。但是寫這麼一點代碼不代表最後就只有這一點代碼,Xcode 會自動加入支持 Darkmode 的代碼,根據不同的構建設備生成不同的控制項。這一內容我們先放在這裡,等下再說。

2. 設計工具

Xcode 11 引入了全新的設計工具,將面向對象編程某種程度上簡化成了面向滑鼠編程。在這個設計工具中,創建一個新的用戶界面只需要操作滑鼠對控制項進行拖動定位,而不需要寫任何代碼。你在設計工具中做的每一步都將實時與編輯器中的代碼同步,同樣,你在代碼中寫的任何代碼都將實時在設計工具中顯示。Xcode 會實時編譯你的代碼,所以你在也不需要等待編譯運行到虛擬機了,現在用滑鼠點擊一下運行按鈕,就可立即開始與界面交互。

3. 跨平台

SwiftUI 原生支持所有的 Apple 設備,所以現在你編寫一份代碼,就可以編譯到所有的 Apple 平台中。SwiftUI 及其原生又極其強大,使用 SwiftUI 開發的 APP 可以在很少的代碼量下實現部署最新的技術。

SwiftUI

  1. 所有的界面,只需描述一次。

一次描述界面下的所有內容和布局後,SwiftUI 就會知道什麼時候應該更新界面重新渲染。

List(landmarks) { landmark in
HStack {
Image(landmark.thumbnail)
Text(landmark.name)
Spacer()

if landmark.isFavorite{
Image(systemName: "star.fill")
.foregroundColor(.yellow)
}
}
}

2. 創建可以重複利用的空間

將多個小控制項組合成為一個大控制項,並在不同的 App 中分享。

struct FeatureCard: View {
var landmark: Landmark

var body: some View {
landmark.featureImage
.resizable()
.aspectRatio(3/2, contentMode: .fit)
.overlay(TextOverlay(landmark))
}
}

3. 簡化你的動畫

現在只需要一步就可以創建順滑的動畫,SwiftUI 會在需要的時候自動計算偏移。

VStack {
Badge()
.frame(width: 300, height: 300)
.animation(.basic())
Text(name)
.font(.title)
.animation(Animation.basic().delay(0.25))
}

SwiftUI 意味著什麼

首先,上述所有的例子都是來自於 Apple 開發者網頁,我只是做了一個簡單的翻譯。我本來是想去操作一下看看的,但是操作需要 Xcode 11 ,Xcode 11 又需要 macOS 10.15 beta。鑒於目前我正在使用的 Macbook Pro 正在用於生產,所以還是放棄了去操作一下的想法。不過我們可以通過官方給的例子來窺探一下未來。

眾所周知,Apple 的所有產品都以 「簡即為上」 為要旨。從喬布斯時代把 iPad 交給小孩看他能不能自然而然的上手來鑒定設計是否成功到現在,Apple 一直在通過自身的努力來儘可能的避免用戶初次上手產品時的疑惑與猶豫。現在,這樣的簡化終於來到 Swift 上了。

就以官方給的創建一個列表為例子,使用 Swift 4.0 我們除了綁定數據意外,還需要註冊列表,實現一些代理方法,完整代碼70,80行,真正與數據有關的代碼只有幾行。而且在 Swift 4.0 時代, Swift 作為一個代碼語言界的新人,其主要目的還是粘合 Object-C ,故其可以調用 Object-C 編寫的函數。但是這樣肯定是不對的。我們拿 UITableView 中的一個代理函數作為例子:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = (tableView.dequeueReusableCell(withIdentifier: "CellID", for: indexPath))
...
return cell
}

以我第一眼看到這個函數的感受為例子,我的感受是:疑惑。因為 Swift 是一個十分優雅的語言,就像 Apple 的設計語言一樣。而這個函數給我的感覺是十分的混亂的(當然菜也是原罪)。究其原因,是因為 UIkit 是用 Object-C 寫的。而 SwiftUI 生來的目的,就是為了統一 Swift 編程的一致度。使用 SwiftUI 編寫的列表,不用實現任何代理函數,綁定每一個數據就像寫網頁一樣的簡單。一切的繁瑣工作,由 Xcode,在後台,為你解決。

而 SwiftUI 的可理解性更是極為優秀的。請你們返回上面,去看看那幾個實例代碼,你會發現,就算你沒有學過 Swift,你也基本上可以看得懂,甚至你會覺得: 我也能寫。這就是 Apple 的魅力,他總是通過一些方法,將一個行業的門檻降到極低。今年 WWDC 有一名中國的 15 歲開發者受邀前往,他通過自學 Swift 完成了一款叫做 Cryptography & Privacy 的應用並獲得了獎學金。這讓我不禁想到了我 15 歲那個時候學的語言:Pascal。我到現在都還不太清楚 Pascal 是如何寫遞歸的,繁瑣的函數關鍵字,難以理解的各種概念,使我最終放棄了 Pascal,轉戰 C++。而 C++ 的 STL 庫在我學的第一天就徹底震驚了我。我非常能夠理解一門簡單而強大的語言是多麼能夠給開發者提供動力。可以預見在 SwiftUI 發布的將來,會有越來越多的人在創建應用程序時選擇將 Swift 作為第一語言。也會有越來越多的人加入開發者這個行列。因為寫程序的快感,堪比創造世界的快感,是其他行業極難,甚至永遠也體會不到的。

現在,就坐等 Xcode 11 正式版的發布吧。


推薦閱讀:
相关文章