[Live in Swift] Vol. 2 用 OptionSet 來輕鬆表示佔壘狀況

更新 發佈閱讀 6 分鐘

在開始之前,先問問大家都看過第一篇了嗎? 還沒的話可以點這邊。

第一篇發佈之後的隔天,我點開了發佈出去的文章,想說看一下有沒有讀者回應,結果發現右上角有一堆通知,嚇了我一大跳! 我想說也太扯了吧,怎麼會有這麼多人看?結果點開通知一看,似乎是爬蟲機器人大軍進攻 方格子 vocus,在下面的留言區瘋狂洗版,我只好一則一則手動刪除QQ,希望這篇發布後不要再 Trigger 到什麼奇怪的開關,讓我的文章正常的擴散出去吧!


回來本篇的正題,繼上篇透過 Enum 來表示簡易的棒球規則,接下來我們要介紹的是如何用 Swift,來優雅的表示棒球場上的佔壘狀況。

本篇的程式碼調整為使用gist嵌入,希望能幫助你閱讀。

我們先將棒球規則裡的佔壘狀況條列出來:

  • 壘上無人
  • 一壘有人
  • 二壘有人
  • 三壘有人
  • 一、二壘有人
  • 一、三壘有人
  • 二、三壘有人
  • 滿壘

在不認識 OptionSet 之前,我們可能會這樣寫:

這樣的寫法雖然可以表示佔壘狀況,但是當我們需要判斷佔壘狀況時,必須要同時判斷三個變數,這樣的寫法不夠優雅,也容易出錯。

這時候我們就可以使用 OptionSet 的特性,來表示佔壘狀況。 但在開始之前,讓我們先簡單認識一下,一些你可能用過,但不知道他是 OptionSet 的東西:

1. UIControl.State 

我們常常在 UIButton 中,透過設定不同的 state 來顯示不同的外觀,例如:

我們點進 state 的屬性,可以看到:

由於 UIButton 繼承自 UIControl,因此也一併得到了 state 屬性,那我們再來看看 UIControl.State 的定義:

我們可以看到,UIControl.State 是一個 OptionSet,他可以表示按鈕的各種狀態,而與 Enum 不同的是,OptionSet 可以表示多個選項的組合,例如:

這樣的寫法,就表示按鈕在正常狀態和按下狀態下,都會顯示 Submit 這個文字。 如果說 Enum 是單選題,那 OptionSet 就是多選題,可以選擇多個答案。

2.UIRectCornerCACornerMask 
在做圓角時,我們常常會使用 UIRectCorner 來表示圓角的各個角落,例如:

這樣的寫法,就表示圓角的左上角和右上角都會有圓角效果。

類似的用法還有 CACornerMask,在繪製 layer 的圓角時,我們會使用 CACornerMask 來表示圓角的各個角落,例如:

這樣的寫法,就表示圓角的左上角和右上角都會有圓角效果。

除了這些,還有許多 OptionSet 的用法,例如 FileManager.DirectoryEnumerationOptionsUIView.AutoresizingMask 等等,這些都是 Swift 原生的 OptionSet 用法。

回到我們的棒球佔壘狀況,我們可以這樣定義:

我們和前面一樣,有三個屬性分別表示三個壘包的佔壘狀況,而不同於前面使用 Bool, OptionSet 在表示佔壘狀況時,會使用 Int 來表示,並且使用位元運算來表示佔壘狀況。

如果你不懂位元運算,這邊簡單解釋一下,位元運算就是將數字轉換成二進位,然後進行位元運算,用上面的例子來解釋的話:

  • firstBase 的值是 1 // 二進位 001 (2的0次方)
  • secondBase 的值是 2 // 二進位 010 (2的1次方)
  • thirdBase 的值是 4 // 二進位 100 (2的2次方)

所以一二壘有人的狀況,就是 1 + 2 = 3,而一三壘有人的狀況,就是 1 + 4 = 5,以此類推,我們把全部的狀況,按照順序條列如下:

  • 0 壘上無人
  • 1 一壘有人
  • 2 二壘有人
  • 3 一、二壘有人
  • 4 三壘有人
  • 5 一、三壘有人
  • 6 二、三壘有人
  • 7 滿壘

至此,我們已經簡單地完成了佔壘狀況的表示,接下來,讓我們用實際的球場狀況來說明,如何用 OptionSet 來表示佔壘狀況。

上面這些例子,相對於原先使用 Bool 來表示佔壘狀況,使用 OptionSet 來表示佔壘狀況,不僅更直覺,也更符合棒球場上的狀況。 你不需要在一次打擊時,同時去更動三個壘包的 Bool 值,你只需要更動一個 OptionSet 的值,就可以表示所有可能的佔壘狀況。

而另外,除了直接 set 佔壘狀況,我們還可以透過 OptionSet 內建的 function,來為佔壘狀況做變化。 例如:

到這邊,我們已經簡單介紹了 OptionSet 的基本概念,並且透過實際的案例,讓你更了解 OptionSet 的用法。

我們可以整理一下,OptionSet 的優勢:

  1. 直覺的語法:使用 [.firstBase, .thirdBase] 這樣的語法簡單易懂
  2. 效率高:底層使用位元運算,非常高效
  3. 組合靈活:可以輕鬆組合和比較各種狀態
  4. 內建集合操作:提供 containsinsertremove 等實用方法
  5. 節省記憶體:多個狀態只需使用一個整數儲存

以上就是這次的內容,有別於前一篇提過的 Enum,這次我們介紹了 OptionSet 的用法,希望這篇文章能夠幫助你更了解 OptionSet 的用法。 你還有感受到哪些 Swift Moment,是你在棒球場上常常遇到的嗎?可以在底下留言和大家分享!


如果覺得這篇文章對你有幫助,也歡迎分享給更多人知道,或者還有想了解的 Swift 技巧,也歡迎留言告訴我!

本篇文章程式碼部分由 AI 輔助產生。

留言
avatar-img
Rice把拔的生活與開發筆記
0會員
26內容數
這裡是我的開發與生活筆記。 分享iOS開發經驗、教學技巧,也記錄生活中的點滴與觀察。 偶爾來點評論,輕鬆聊聊技術與日常。
你可能也想看
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節旨在為讀者提供Swift程式語言的基礎知識,包括其基本語法、註解方法和變數使用方式,並通過具體的程式碼示例來說明這些概念。這將幫助讀者理解Swift的基本結構,並學會如何在Swift中定義變數並使用註解。
Thumbnail
本章節旨在為讀者提供Swift程式語言的基礎知識,包括其基本語法、註解方法和變數使用方式,並通過具體的程式碼示例來說明這些概念。這將幫助讀者理解Swift的基本結構,並學會如何在Swift中定義變數並使用註解。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News