2024-05-24|閱讀時間 ‧ 約 24 分鐘

Swift字串的比較

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

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回答

其實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再比較🙂

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.