SwiftUI - 百行代碼變十行蹋凝,Swift再創(chuàng)輝煌

蘋(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牡直,一起剝皮案震驚了整個(gè)濱河市缀匕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碰逸,老刑警劉巖乡小,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異花竞,居然都是意外死亡劲件,警方通過(guò)查閱死者的電腦和手機(jī)掸哑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)约急,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苗分,你說(shuō)我怎么就攤上這事厌蔽。” “怎么了摔癣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵奴饮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我择浊,道長(zhǎng)戴卜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任琢岩,我火速辦了婚禮投剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘担孔。我一直安慰自己江锨,他們只是感情好吃警,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著啄育,像睡著了一般酌心。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挑豌,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天安券,我揣著相機(jī)與錄音,去河邊找鬼浮毯。 笑死完疫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的债蓝。 我是一名探鬼主播壳鹤,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼饰迹!你這毒婦竟也來(lái)了芳誓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啊鸭,失蹤者是張志新(化名)和其女友劉穎锹淌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赠制,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赂摆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钟些。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烟号。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖政恍,靈堂內(nèi)的尸體忽然破棺而出汪拥,到底是詐尸還是另有隱情,我是刑警寧澤篙耗,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布迫筑,位于F島的核電站,受9級(jí)特大地震影響宗弯,放射性物質(zhì)發(fā)生泄漏脯燃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一蒙保、第九天 我趴在偏房一處隱蔽的房頂上張望辕棚。 院中可真熱鬧,春花似錦、人聲如沸坟募。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懈糯。三九已至涤妒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赚哗,已是汗流浹背她紫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屿储,地道東北人贿讹。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像够掠,于是被迫代替她去往敵國(guó)和親民褂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容