數字字面量
整數字面量寫法如下:
· 十進制數,無前綴
· 二進制數,以 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 類型作為所有常規(guī)用途的整數常量及變量的類型,即使它們的確為非負數。日常使用中,使用默認的整數類型意味著這些整型常量與變量均可即時互相參與運算,并可與根據整數字面值推斷出的類型相匹配。
僅當手中的任務必須使用其他整數類型時才用它們,如外部數據源提供寬度明確的數據,或為了性能、內存占用等其他必需優(yōu)化的情況考慮。在這些情況下使用寬度明確的類型有助于發(fā)現偶然的數值溢出和捕捉使用時數據的原始信息。
整數轉換
不同數字類型所能存儲的值域范圍是不同的。一個 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 創(chuàng)建新的 UInt16。不過,在這里并不能傳入任意類型——只能傳入 UInt16 提供有構造函數的類型。擴展現有類型使其提供接受新類型(包括自己定義的類型)的構造函數的方法請見 擴展 (后面會譯到)一章。
整數和浮點數間的轉換
整數與浮點數類型間的轉換必須顯式指定:
1 let three = 32 let pointOneFourOneFiveNine = 0.141593 let pi = Double(three) + pointOneFourOneFiveNine4 // pi 等于 3.14159, 故而推斷類型為Double
在上例中,常量 three 的值被用來創(chuàng)建一個新的 Double 類型,以便加號兩側的類型保持一致,如果類型沒有轉換,是不允許相加的。
反過來,浮點數到整數的轉換同樣可行,整數類型可以用 Double 或 Float 值初始化:
1 let integerPi = Int(pi)2 // integerPi 等于 3, 類型推斷為Int
這樣用浮點數初始化為新的整數時,浮點數值總會被截斷。即, 4.75 變?yōu)?4, -3.9 變?yōu)?-3。
注意:
數字常量或變量的結合規(guī)則與數字字面量的結合規(guī)則不同。字面量 3 可以直接與字面量 0.14159 相加,因為數字字面量沒有明確指定類型,它們自身也沒有明確的類型。其類型僅當被編譯器求值時才推斷得出。
謝謝,Swifter-QQ群:362232993,同好者進~
Fork:https://github.com/Joejo/Swift-lesson-for-chinese
新聞熱點
疑難解答