數字字面量
整數字面量寫法如下:
· 十進位數,無首碼
· 位元,以 0b 為首碼
· 八位元,以 0o 為首碼
· 十六進位數,以 0x 為首碼
下面所有整數的十進位值為 17 :
1 let decimalInteger = 172 let binaryInteger = 0b10001 // 17 二進位標識3 let octalInteger = 0o21 // 17 八進位標識4 let hexadecimalInteger = 0x11 // 17 十六進位標識
浮點數字面量可以是二進位(無首碼)或十六進位(以 0x 為首碼),小數點的兩側必須有各有一個數字(或十六進位數字)。他們都可以擁有一個可選的指數冪,十進位小數標記為大寫或小寫 e ,十六進位標記為大寫或小寫 p 。
指數冪為 exp 的十進位數字,它的基數將乘以 10exp :
· 1.25e2 表示 1.25 × 102, 或 125.0.
· 1.25e-2 表示 1.25 × 10-2, 或 0.0125.
指數冪為 exp 的十六進位數字,它的基數將乘以 2exp:
· 0xFp2 表示 15 × 22, 或 60.0.
· 0xFp-2 表示 15 × 2-2, 或 3.75.
下面所有浮點數的十六進位值為 12.1875:
1 let decimalDouble = 12.18752 let exponentDouble = 1.21875e13 let hexadecimalDouble = 0xC.3p0
數字字面量可以包含其它的格式以便於閱讀。整數與浮點數均可以添加多餘的零或底線以提高可讀性。兩種格式均不會影響字面量的實際值:
1 let paddedDouble = 000123.4562 let oneMillion = 1_000_0003 let justOverOneMillion = 1_000_000.000_000_1
數字類型轉換
代碼中應使用 Int 類型作為所有常規用途的整數常量及變數的類型,即使它們的確為非負數。日常使用中,使用預設的整數類型意味著這些整型常量與變數均可即時互相參與運算,並可與根據整數字面值推斷出的類型相匹配。
僅當手中的任務必須使用其他整數類型時才用它們,如外部資料源提供寬度明確的資料,或為了效能、記憶體佔用等其他必需最佳化的情況考慮。在這些情況下使用寬度明確的類型有助於發現偶然的數值溢出和捕捉使用時資料的原始資訊。
整數轉換
不同數字類型所能儲存的範圍範圍是不同的。一個 Int8 常量或變數能儲存 -128 到 127 之間的數字,而一個 UInt8 常量或變數能儲存 0 到 255 的數字。無法存進一個整型的常量或變數的數字編譯時間會報錯:
1 let cannotBeNegative: UInt8 = -12 // UInt8 不能儲存負數, 所以這裡會報錯的
3 let tooBig: Int8 = Int8.max + 14 // Int8 不能儲存超過其最大值範圍的數字,5 // 所以這裡也會報錯的
由於不同資料類型能儲存的範圍不同,在進行資料轉換時需要具體問題具體對待。這種實際選擇的過程可避免隱式轉換的問題,還能在代碼中強化類型轉換的意圖。
要將一個數位類型轉換為另一種,應先把現有值初始化一個所需類型的新的數字。下例中,常量 twoThousand 的類型為 UInt16,而常量 one 的類型為 UInt8。它們無法直接相加,因為類型不同。因此,本例將調用 UInt16(one) 建立一個 UInt16 數,並將 one 的數值初始化,用初始化的新值(新值為 UInt16 )取代原始值(原始值為 UInt8 ):
1 let twoThousand: UInt16 = 2_0002 let one: UInt8 = 13 let twoThousandAndOne = twoThousand + UInt16(one)//將常量one初始化為UInt16
現在加號兩側均為 UInt16 類型,因此相加合法。輸出的常量 (twoThousandAndOne) 的推斷類型為 UInt16,因為其為兩個 UInt16 值之和。
某些類型(初始值) 是調用 Swift 類型建構函式並傳遞初始值的預設方法。幕後運作情況是,UInt16 有一個接受 UInt8 值的建構函式,因此該建構函式會被用於根據現有 UInt8 建立新的 UInt16。不過,在這裡並不能傳入任意類型——只能傳入 UInt16 提供有建構函式的類型。擴充現有類型使其提供接受新類型(包括自己定義的類型)的建構函式的方法請見 擴充 (後面會譯到)一章。
整數和浮點數間的轉換
整數與浮點數類型間的轉換必須顯式指定:
1 let three = 32 let pointOneFourOneFiveNine = 0.141593 let pi = Double(three) + pointOneFourOneFiveNine4 // pi 等於 3.14159, 故而推斷類型為Double
在上例中,常量 three 的值被用來建立一個新的 Double 類型,以便加號兩側的類型保持一致,如果類型沒有轉換,是不允許相加的。
反過來,浮點數到整數的轉換同樣可行,整數類型可以用 Double 或 Float 值初始化:
1 let integerPi = Int(pi)2 // integerPi 等於 3, 類型推斷為Int
這樣用浮點數初始化為新的整數時,浮點數值總會被截斷。即, 4.75 變為 4, -3.9 變為 -3。
注意:
數字常量或變數的結合規則與數字字面量的結合規則不同。字面量 3 可以直接與字面量 0.14159 相加,因為數字字面量沒有明確指定類型,它們自身也沒有明確的類型。其類型僅當被編譯器求值時才推斷得出。
謝謝,Swifter-QQ群:362232993,同好者進~
Fork:https://github.com/Joejo/Swift-lesson-for-chinese