Swift 5.9 中 if 與 switch 語句簡潔新語法讓擼碼更帶勁

在這里插入圖片描述

概覽

在實際代碼開發中,可能初學 Swift 語言的小伙伴們在擼碼時最常用的得數 if 和 switch…case 條件選擇語句了。不過在某些場景下它們顯得略有那么一丟丟“矯揉造作”,還好從 Swift 5.9 開始蘋果知趣的為其簡化了語法且增強了它們的表現力。

在本篇博文中,您將學到如下內容:

  • 概覽
  • 1. Swift 中的 if 和 switch 條件語句
  • 2. 三元操作符(ternary expression)
  • 3. Swift 5.9 if 與 switch 簡潔的新語法
  • 4. 新語法的“美中不足”
  • 總結

在這里插入圖片描述

“九尺之臺起于壘土,千里之行始于足下”,Swift 語言里 if 和 switch…case 語句是任何絕妙 App 搭建的“盤石桑苞”!

那小伙伴們還等什么呢?讓我們馬上開始燥起來吧!

Let‘s go!!!😃


1. Swift 中的 if 和 switch 條件語句

在任何語言的結構化編程模式中條件與分支判斷一直是當仁不讓的“絕對核心”,這對于 Swift 語言自然也不例外。

在 Swift 語言中我們可以使用 if…else 語句來表達一般的條件與分支判斷邏輯:

if tooBig {reductIt()
} else {usingIt()
}

我們還可以使用 else 子句進一步拓展 if 語句來匹配多種條件:

var number = 11if number == 0 {print("Zero!!!")
} else if number < 0 {print("小于零")
} else if number >= 100 && number < 1000 {print("大于等于 100,且小于1000")
} else {print("\(number) 其它情況")
}

當然,我們也可以用 switch…case 重構上面的 if…else 代碼:

switch number {
case 0:print("Zero!!!")
case ..<0:print("小于零")
case 100..<1000:print("大于等于 100,且小于1000")
default:print("\(number) 其它情況")
}

在 Swift 語言中我們同樣可以用 if + let 語句的組合來快速捕獲可選值(Optional):

var name: String? = "大熊貓侯佩"if let name = name {print("\(name)")
}

從 Swift 5.7 開始,蘋果對于上述代碼提供了更簡潔的語法:

var name: String? = "大熊貓侯佩"if let name {print("\(name)")
}

更進一步,if 語句還可以搭配 case 組合成 if case let 模式匹配語句:

enum MyError: Error {case textTooShort(actual: Int, min: Int)
}let MIN_LEN = 5
let text = "wo"do {if text.count < MIN_LEN {throw MyError.textTooShort(actual: text.count, min: MIN_LEN)}
} catch let my_error as MyError {if case MyError.textTooShort(let actual, let min) = my_error {print("輸入文字長度(\(actual))太短了,不能小于(\(min))")} else {print("其它 MyError: \(my_error)")}
} catch {print("Other ERR: \(error)")
}

在上面的代碼中,我們使用模式匹配 if case let 語句優雅的將特定錯誤所綁定的信息解析了出來。

關于 Swift 中模式匹配的進一步詳細介紹請小伙伴們移步如下博文觀賞:

  • Swift 入門之自定義類型的模式匹配(Pattern Matching)
  • Swift 初學者趣談:一招教你記住模式匹配 if case let 的語法,永不忘記

2. 三元操作符(ternary expression)

然而,在某些簡單情況下我們希望條件選擇語句越簡約越好,比如在下面的例子中我們利用 if…else 語句依照條件(isNeedShortName)的不同值產生了對應不同的 personName 變量,一個 personName 要寫 3 遍,這你們也能忍?

struct Person {var name: Stringvar shortName: String
}let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = true// personName 變量名稱多次出現,略顯冗余
let personName: String
if isNeedShortName {personName = hopy.shortName
} else {personName = hopy.name
}

所幸的是和其它語言類似,Swift 也提供了三元操作符(ternary expression)來簡化條件選擇邏輯:

let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = true
let personName = isNeedShortName ? hopy.shortName : hopy.name

可以看到使用三元操作符讓原來繁瑣的代碼變得“輕騎減從”了。但是因為三元操作符將全部邏輯都放在同一行中,過度使用它有可能讓代碼變得更加晦澀難懂。

這又該如何是好呢?


更多關于 Swift 基礎指令、操作符和語法的系統性學習,請小伙伴們來我的博客專欄恣意吸取養分:

在這里插入圖片描述

  • Swift 語言開發精講

3. Swift 5.9 if 與 switch 簡潔的新語法

前文提到了濫用三元操作符可能出現的一些弊端。

不過別著急,從 Swift 5.9 開始蘋果精簡和完善了 if 與 switch 的語法,讓條件選擇既能層次分明又能言簡意賅:

let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {hopy.shortName
} else {hopy.name
}

從上面代碼可以看出:新語法讓禿頭碼農們只需書寫一次 personName 變量。我們硬是將 if…else 語法寫出了三元操作符的“小鳥依人”,同時做到了楚楚有致,這讓我們怎能“云胡不喜”呢?

新語法同樣也可以用在 switch…case 語句上:

enum Size {case small, mid, big
}let size = Size.midlet sizeDesc = switch size {
case .small:"小號"
case .mid:"中號"
case .big:"大號"
}

Swift 5.9 中新語法除了對尋常條件判斷表達式的簡化“有如神助”以外,我們還可以進一步如法炮制利用它們來精簡其它類似的邏輯:

struct Msg {var emergencyDegree = 0var msgColor: Color {switch emergencyDegree {case 0..<5:.graycase 5..<10:.greencase 10..<15:.yellowcase 15..<20:.orangedefault:.red}}
}let msg = Msg(emergencyDegree: 20)
print(msg.msgColor)

比如在上面的代碼中,Swift 5.9 新語法在 msgColor 計算屬性的定義中為我們解囊相助省去了海量的 return 語句,就問你們贊不贊!?

4. 新語法的“美中不足”

雖然 Swift 5.9 新語法很好很強大,但是目前對于 if 相關的語法還是有一些“限制”的。

首先 if 必須帶上 else 子句。

不過,想想這也合情合理,如若不然我們就無法顧及到每種可能的條件了。

另一個局限是新 if 語句中不能出現多行代碼,比如下面示例就無法通過編譯:

let hopy = Person(name: "大熊貓侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {print("for short name")hopy.shortName
} else {print("for full name")hopy.name
}

關于該特性孰是孰非的全面討論,請大家移步到蘋果官方開發者論壇邊吃瓜邊觀賞“神仙打架”:

  • discussion about this on the Swift Forums

至此,我們徹底弄明白了 Swift 5.9 中新條件選擇語法帶來的巨大便利,借助于他的東風我們又可以愉快的進行擼碼造福世界人民了,棒棒噠!💯

總結

在本篇博文中,我們介紹了 Swift 語言中條件選擇指令的“前世今生”,并討論了 Swift 5.9 中 if 和 switch 語句更簡潔的新語法。

感謝觀賞,再會!😎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13386.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vitis HLS 學習筆記--優化本地存儲器訪問瓶頸

目錄 1. 簡介 2. 代碼解析 2.1 原始代碼 2.2 優化后 2.3 分析優化措施 3. 總結 1. 簡介 在Vitis HLS中&#xff0c;實現II&#xff08;迭代間隔&#xff09; 1是提高循環執行效率的關鍵。II1意味著每個時鐘周期都可以開始一個新的迭代&#xff0c;這是最理想的情況&…

Java實現音頻轉文本(語音識別)

在Java中實現音頻轉文本&#xff08;也稱為語音識別或ASR&#xff09;通常涉及使用專門的語音識別服務&#xff0c;如Google Cloud Speech-to-Text、IBM Watson Speech to Text、Amazon Transcribe、Microsoft Azure Speech Services&#xff0c;或者一些開源庫如CMU Sphinx。 …

2024年第四屆長三角高校數學建模競賽C題思路

賽道C:汽后配件需求預測問題 在汽后行業的供應鏈管理中, 精準的需求預測是后續管理及決策的基礎。 各個汽后配件即為一個庫存單位(SKU, Stock Keeping Unit), 如果可以準確預知未來對于各個配件的市場需求, 就可以提前將庫存放在靠近需求的倉庫中, 從而降低庫存成本,…

HNCTF ——baby_python

H&NCTF 2024 官方WP (qq.com) OpCodes Pickle.jl (juliahub.com) nc之后 PS D:\ForCode\pythoncode\.idea> nc hnctf.yuanshen.life 33267 # Python 3.10.12 from pickle import loads main b"\x80\x04ctypes\nFunctionType\n(ctypes\nCodeType\n(I1\nI0\nI0\n…

[Linux] 常用服務器命令(持續更新)

文件操作 # 顯示文件系統的磁盤空間使用情況 df -h全局查找文件 find / -type f -iname "java"find / -name libncurses*拷貝整個文件夾 cp -r /home/a/ /home/b/ 解壓&#xff0c;撤銷解壓 撤銷zip解壓 zipinfo -1 path/xx.zip | xargs rm -rf 撤銷tar解壓 tar …

【Vim】

一、什么是Vim&#xff1f; Vim 是一個歷史悠久的文本編輯器&#xff0c;可以追溯到 qed。 Bram Moolenaar 于 1991 年發布初始版本。Vim 有著悠久的歷史;它起源于 Vi 編輯器&#xff08;1976 年&#xff09;&#xff0c;至今仍在開發中。(Vim has a rich history; it origina…

css+html 愛心?

效果 代碼實現 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

MySQL第一次作業(基本操作)

目錄 一、登陸數據庫 二、創建數據庫zoo 三、修改數據庫zoo字符集為gbk 四、選擇當前數據庫為zoo 五、查看創建數據庫zoo信息 六、刪除數據庫zoo 一、登陸數據庫 指令&#xff1a; mysql -u root -p 二、創建數據庫zoo 指令&#xff1a; create database zoo; 三、修改數…

基于PHP+MySQL組合開發的多用戶自定義商城系統源碼 附帶源代碼包以及搭建教程

系統概述 互聯網技術的飛速發展&#xff0c;電子商務已成為人們日常生活中不可或缺的一部分。商城系統作為電子商務的核心&#xff0c;其開發技術和用戶體驗直接影響著電商平臺的競爭力和用戶滿意度。本文旨在介紹一個基于PHPMySQL組合開發的多用戶自定義商城系統&#xff0c;…

C++學習~~string類

1.STL簡單介紹 &#xff08;1&#xff09;標準模版庫&#xff0c;是C里面的標準庫的一部分&#xff0c;C標準庫里面還有其他的東西&#xff0c;但是我們不經常使用&#xff0c;我們經常使用的還是STL這個標準庫部分。 &#xff08;2&#xff09;六大件&#xff1a;仿函數&…

C# WinForm —— 16 MonthCalendar 介紹

1. 簡介 可以選擇單個日期&#xff0c;也可以選擇一段日期&#xff0c;在選擇時間范圍上 比較適用&#xff0c;但不能跨月份選擇日期范圍 在直觀上&#xff0c;可以快速查看、選擇日期/日期范圍 2. 常用屬性 屬性解釋(Name)控件ID&#xff0c;在代碼里引用的時候會用到,一般…

Uni-app基礎知識

uni-app組成和跨端原理 | uni-app官網uni-app,uniCloud,serverless,uni-app組成和跨端原理,基本語言和開發規范,編譯器,運行時&#xff08;runtime&#xff09;,邏輯層和渲染層分離https://uniapp.dcloud.net.cn/tutorial/1.adb連接模擬器 找到adb所在位置&#xff08;一般在hb…

C++ 程序員常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (簡體中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

一網打進Linux下那些查找命令

查找是我們每天都在做的事情&#xff0c;早上醒來找下手機&#xff0c;出門之前查下公交&#xff0c;坐下之后查下資料&#xff0c;分析數據查下模式。 查找文件&#xff0c;查找信息&#xff0c;查找錯誤是應用起來更為具體的一些工作&#xff0c;而Linux命令行為我們提供了很…

對稱加密算法的應用場景

隨著信息技術的飛速發展&#xff0c;數據安全成為了至關重要的議題。在保護數據傳輸和存儲的過程中&#xff0c;加密算法扮演著不可或缺的角色。其中&#xff0c;對稱加密算法&#xff0c;由于其高效性和易用性&#xff0c;被廣泛應用于各種場景中。本文將探討對稱加密算法的主…

Kubernets多master集群構建負載均衡

前言 在構建 Kubernetes 多 Master 集群時&#xff0c;實現負載均衡是至關重要的一環。通過多臺 Master 節點配合使用 Nginx 和 Keepalived 等工具&#xff0c;可以有效提高集群的可靠性和穩定性&#xff0c;確保系統能夠高效運行并有效應對故障。接下來將介紹如何配置這些組件…

Kotlin 編譯器和工具鏈:深入解析與實踐案例

Kotlin 編譯器和工具鏈是構建 Kotlin 項目的核心組件&#xff0c;它們負責將 Kotlin 代碼轉換為可在 JVM 或 JavaScript 環境中運行的代碼。本文將詳細介紹 Kotlin 編譯器和工具鏈的工作原理、使用方法&#xff0c;以及在實際開發中的應用案例。 1. 引言 Kotlin 作為一種現代…

JAVA GUI 植物大戰僵尸

公眾號&#xff1a;編程驛站 沒有做太多封裝。難免有冗余。源碼全部放出&#xff0c;有興趣者可以再改之。 1. pea 類 package com.hm;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExce…

物業水電抄表系統的全面解析

1.系統概述 物業水電抄表系統是現代物業管理中的重要組成部分&#xff0c;它通過自動化的方式&#xff0c;實時監控和記錄居民或企業的水電使用情況&#xff0c;極大地提高了工作效率&#xff0c;降低了人工抄表的錯誤率。該系統通常包括數據采集、數據傳輸、數據分析和數據展…

鏈表OJ題(移除鏈表元素,反轉鏈表,分割鏈表,環形鏈表(是否成環問題),鏈表中間節點(快慢指針講解),環形鏈表(找入環節點))“題目來源力扣附帶題目鏈接”

目錄 1.移除鏈表元素 2.反轉鏈表 2.1三指針法 2.2頭插法 3.分割鏈表 4.鏈表的中間節點&#xff08;快慢指針&#xff09; 4.1快慢指針 4.2求鏈表的中間節點 5.環形鏈表 5.1環形鏈表是否成環 5.2環形鏈表入環節點 5.3入環節點推論的不完備性說明 1.移除鏈表元素 移除…