Swift字串的比較

更新於 2024/05/24閱讀時間約 4 分鐘

看到同事的程式碼,直接拿日期字串去比大小,猜猜結果是哪個

let a = "2024-05-22 17:14:47" 
let b = "2024-05-22 17:16:00"

if a > b {
print("a>b")
} else if a == b {
print("a=b")
} else if a < b {
print("a<b")
} else {
print("無法比較")
}

.

.

.

.

.

.

.

.

.

.

答案:a < b

讓我覺得好神奇,我都是乖乖轉成Date再去比的人QQ
難道swift能夠自動判斷現在比的是時間嗎🤔

為什麼swift知道要用時間來判斷

chatgpt回答

chatgpt回答

其實swift並不知道我們比的是時間,他只是一個一個字拿去比。剛好格式是照年>月>日>時>分>秒,由大到小排下來所以這個方法有效。如果換一個格式例如:HH:mm:dd MM-dd-yyyy 就會失效了,比較安全的做法還是要乖乖轉成Date再比較。

同樣道理測試其他的字串

數字字串

"1496" < "789"

先比較第一個字符:

    • "1496"第一個字符是 "1"
    • "789"第一個字符是 "7"

由於 "1" 小於 "7",比較結果已經確定:"1496" < "789"

符號字串

"-" > "+"

在這個情況下,比較的是字符 -+ 的大小。根據 ASCII 碼表,- 的 ASCII 值(45)> + 的 ASCII 值(43)。

表情符號字串

"😀" < "🥰"

Unicode scalar 是由一個或多個 21 位元的數字組成,代表 Unicode 字元的唯一編碼點。在 Swift 中,每個 Unicode scalar 都對應著一個 Unicode.Scalar 實例。

分別查看這兩個字符串的 Unicode scalar:

  1. 字符串 😀 的 Unicode scalar:
    • Unicode scalar 的值為 128512
  2. 字符串 🥰 的 Unicode scalar:
    • Unicode scalar 的值為 129392

因為 Unicode scalar 的值 128512 小於 129392,所以"😀" < "🥰"。

補充:UnicodeScalar

unicodeScalars 是一個屬性,它可以讓你對字符串中的每個 Unicode code point進行訪問。Unicode code point是 Unicode 字符集中的一個字符,它對應於一個唯一的數值。

用這個方法可以印出組成這個字串的unicode

for scalar in string.unicodeScalars { print(scalar.value) }


scalar.value 是 Unicode code point的十進位表示法。 Unicode code point是一個整數,代表了 Unicode 字元集中的一個字元。它不是 ASCII 碼,而是 Unicode 的一部分。
Unicode 字元集是一個包含了世界上大多數字元的標準,包括了 ASCII 字元集。每個字元都有一個唯一的 Unicode 碼點,這個碼點可以用不同的表示方式,如十六進制、十進制等。
所以,scalar.value 印出來的值是該字元的 Unicode 碼點的十進位表示。這個值與 ASCII 碼並不完全相同,但是 ASCII 碼是 Unicode 碼點的一部分,所以如果字元是 ASCII 字符,它們的 Unicode 碼點和 ASCII 碼是相同的。


結論:雖然了解了這麼多,一開始的問題還是要轉成Date再比較🙂

avatar-img
7會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
最近碰到個神奇的需求,App啟動時,才要用firebase remoteConfig去決定初始畫面。該文章詳細介紹了在App啟動時如何利用firebase remoteConfig去決定初始畫面,以及解決在推播的情況下造成跳轉無效的問題。
這篇文章主要討論了在 iOS 開發中,使用 UIImagePickerController 來選取 GIF 圖片時會變成靜態截圖的問題,並推薦了使用新的 PHPickerViewController 選取 GIF 檔案。同時提供了一些處理 GIF 圖片的方法。
這篇文章介紹了 iOS 中常用的 Design Patterns,包括 MVC、MVVM、Singleton、Delegation、Observer 等。同時比較了 Delegate 和 Notification 的使用時機。參考資料中還有更多相關資訊。
本文紀錄了MVC和MVVM的差異,包括各自的優缺點和最大差異,並討論了MVVM的商業邏輯應該寫在哪的問題。
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
最近碰到個神奇的需求,App啟動時,才要用firebase remoteConfig去決定初始畫面。該文章詳細介紹了在App啟動時如何利用firebase remoteConfig去決定初始畫面,以及解決在推播的情況下造成跳轉無效的問題。
這篇文章主要討論了在 iOS 開發中,使用 UIImagePickerController 來選取 GIF 圖片時會變成靜態截圖的問題,並推薦了使用新的 PHPickerViewController 選取 GIF 檔案。同時提供了一些處理 GIF 圖片的方法。
這篇文章介紹了 iOS 中常用的 Design Patterns,包括 MVC、MVVM、Singleton、Delegation、Observer 等。同時比較了 Delegate 和 Notification 的使用時機。參考資料中還有更多相關資訊。
本文紀錄了MVC和MVVM的差異,包括各自的優缺點和最大差異,並討論了MVVM的商業邏輯應該寫在哪的問題。
在寫SwiftUI view的時候,碰到一個瓶頸(? 帶有Binding的參數要如何preview。 舉例來說有個右邊圖片左邊文字的View,給他一個@Binding var isActive: Bool的狀態,當active時圖片要跟著改變: struct RightImageView: Vie
雖然我之前文章大力讚美SwiftUI的tabView有多好用,無奈專案大部分都是UIKit啊~~~~要在既有專案用Tab架構只能用UITabBarController了 設計這次還出了一個超複雜的UI,陰影+圓角+客製化高度 大套餐 馬上開始吧。 圓角+陰影 重點就是subclass一個
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
CBCentralManager:藍芽管理中心,做外部設備搜尋、連接。 CBPeripheral:外部設備 CBCharacteristic:外部設備的特徵。 首先要在info.plist裡設定新增藍芽服務。然後做宣告,如下: var centralManager: CBCentralM
Thumbnail
CBCentralManager:藍芽管理中心,做外部設備搜尋、連接。 CBPeripheral:外部設備 CBCharacteristic:外部設備的特徵。 首先先宣告: var centralManager: CBCentralManager = CBCentralManager.ini
Thumbnail
字串交換: let str = "被誰喜歡,又喜歡誰呢?" // 交換 print(str.replacingOccurrences(of: ",又", with: "?")) //被誰喜歡?喜歡誰呢? 字串去首尾: let str = "被誰喜歡,又喜歡誰呢?" // 去首尾 print
Thumbnail
十進位轉二進位(Decimal to Binary) let dec = -813 let bin = String(UInt16(bitPattern: Int16(dec)), radix: 2) print(bin) // "1111110011010011" 十進位轉八進位(Deci
Thumbnail
十進位轉二進位(Decimal to Binary) let dec = 813 let bin = String(dec, radix: 2) print(bin) // "1100101101" 十進位轉八進位(Decimal to Octal) let dec = 813 let o
三元條件運算子(Ternary Conditional Operator)是一種簡潔的寫法,用於在滿足條件時返回一個值,否則返回另一個值。 基本語法 其中,condition是要測試的條件,如果為true,則返回valueIfTrue,否則返回valueIfFalse。
Thumbnail
如何將對稱密鑰轉換成字串,以及如何從字串反向生成原有的對稱密鑰
Thumbnail
俄羅斯被踢出 SWIFT 支付系統,媒體形容是美、歐政府對俄羅斯發動了金融核戰。到底什麼是 SWIFT 它是如何運作的,鬼宿來告訴大家媒體沒有說清楚的事。可以這麼說:如果沒有 SWIFT;美元連在境內流動都將是不可能的任務。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
CBCentralManager:藍芽管理中心,做外部設備搜尋、連接。 CBPeripheral:外部設備 CBCharacteristic:外部設備的特徵。 首先要在info.plist裡設定新增藍芽服務。然後做宣告,如下: var centralManager: CBCentralM
Thumbnail
CBCentralManager:藍芽管理中心,做外部設備搜尋、連接。 CBPeripheral:外部設備 CBCharacteristic:外部設備的特徵。 首先先宣告: var centralManager: CBCentralManager = CBCentralManager.ini
Thumbnail
字串交換: let str = "被誰喜歡,又喜歡誰呢?" // 交換 print(str.replacingOccurrences(of: ",又", with: "?")) //被誰喜歡?喜歡誰呢? 字串去首尾: let str = "被誰喜歡,又喜歡誰呢?" // 去首尾 print
Thumbnail
十進位轉二進位(Decimal to Binary) let dec = -813 let bin = String(UInt16(bitPattern: Int16(dec)), radix: 2) print(bin) // "1111110011010011" 十進位轉八進位(Deci
Thumbnail
十進位轉二進位(Decimal to Binary) let dec = 813 let bin = String(dec, radix: 2) print(bin) // "1100101101" 十進位轉八進位(Decimal to Octal) let dec = 813 let o
三元條件運算子(Ternary Conditional Operator)是一種簡潔的寫法,用於在滿足條件時返回一個值,否則返回另一個值。 基本語法 其中,condition是要測試的條件,如果為true,則返回valueIfTrue,否則返回valueIfFalse。
Thumbnail
如何將對稱密鑰轉換成字串,以及如何從字串反向生成原有的對稱密鑰
Thumbnail
俄羅斯被踢出 SWIFT 支付系統,媒體形容是美、歐政府對俄羅斯發動了金融核戰。到底什麼是 SWIFT 它是如何運作的,鬼宿來告訴大家媒體沒有說清楚的事。可以這麼說:如果沒有 SWIFT;美元連在境內流動都將是不可能的任務。