[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
留言分享你的想法!
avatar-img
Rice Lin的沙龍
0會員
5內容數
這裡是我的開發與生活筆記。 分享iOS開發經驗、教學技巧,也記錄生活中的點滴與觀察。 偶爾來點評論,輕鬆聊聊技術與日常。
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News