一、整型
1.1 整數和整型
編程語言中的整型是用來表示我們自然界中的整數。先來補習一下小學的知識,整數的概念:正整數、零、負整數統稱為整數。
按照有無符號可以分為兩種:1.有符號整數(正整數、零、負整數)2.無符號整數(正整數和零)
Swift提供了8,16,32和64位的有符號和無符號的整數類型,比如:8位無符號整數類型是UInt8,32位有符號整數類型Int32。
1.2 整型表示的范圍
Swift中提供了min和max屬性來訪問不同整數類型的最小值和最大值,比如8位無符號/有符號整型表示的最大值最小值,如圖:
1.3 Int類型
一般寫代碼的時候不需要專門制定整數類型的長度,Swift還提供了一個特殊的整數類型:Int,Int類型的長度取決於當前平台的系統位數:
在32位平台上Int類型就是32位,和Int32長度相同。
在64位平台上Int類型就是64位,和Int64長度相同。
1.4 UInt類型
UInt類型和Int類型一樣,它的長度取決於當前平台的系統位數。
注意:
開發中盡量不要使用UInt類型,最好使用Int,即使你要儲存的值就是非負數。可以提高代碼的復用性,避免不同類型數字之間的轉換,並且匹配數字的類型推斷。
二、浮點型
浮點數就是帶有小數點的數字,比如常見的:3.14,0.618。Swift中提供了兩種浮點數類型:
Float 表示32位浮點數。精度要求不高的話使用此類型。
Double表示64位浮點數。當需要儲存很大或者很高精度的浮點數的時候才使用此類型。
注意:
Double的精度可以達到小數點後至少15位數字,而Float只有小數點後6位。一般來說Float類型足夠用。
三、類型安全和類型推斷
Swift是一種類型安全(type safe)的語言。類型安全的語言可以讓你清除的知道代碼要處理的值的類型。如果你的代碼需要傳遞的參數是String類型,那麼你絕對不可能不小心船進入一個非String類型。
由於Swift是類型安全的,所以它會在編譯你的代碼時進行類型檢查(typy checks),並把不匹配的類型標記為錯誤,這樣可以讓你盡早的發現問題並修復。
當你要處理不同類型的值時,類型檢查可以幫你避免錯誤。但是你不必每次聲明常量、變量的時候都顯示制定類型,如果沒有制定類型,Swift會使用類型推斷(type inference)幫你選擇合適的類型。原理就是檢查你的賦值即可。
雖然有類型推斷,但是Swift很少需要自己顯示聲明類型,這些工作交給編譯器去做就可以了。
例如:
聲明一個沒有標注類型的常量money,賦值998,Swift可以推斷出常量的類型是Int,從下圖控制台的信息可以得到論證:
如果你給變量、常量賦值了一個浮點類型的值,Swift會默認推斷為Double類型,如圖:
四、數值型字面量
一個整數的字面量可以被寫成以下幾種形式:
一個十進制數,沒有前綴
一個二進制數,前綴是0b
一個八進制數,前綴是0o
一個十六進制數,前綴是0x
比如:
浮點型字面量可以是十進制(沒有前綴)或者十六進制(前綴是0x)。小數點兩邊必須有至少一個十進制數字(或者是十六進制的數字)。十進制浮點數也可以有一個可選的指數(exponent),通過大寫或者小寫的e來制定,十六進制浮點型數必須有一個指數,通過大寫或者小寫的p來指定。
如果一個十進制數的指數為exp,那這個數相當於基數和10^exp的乘積:
1.25e2 表示1.25 × 10^2,等於125.0。
1.25e-2表示1.25×10^-2,等於0.0125。
如果一個十六機制數的指數為exp,那這個數相當於基數和的2^exp的乘積:
0xFp2表示15×2^2,等於60.0.
0xFp-2表示15×2^-2,等於3.75。
下面的這些浮點字面量都等於十進制的12.1875:
let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0
數值類字面量可以包括額外的格式來增強可讀性。整數和浮點數都可以添加額外的零並且包含下劃線,並不會影響字面量:
let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
五、數值型類型轉換
在開發的時候,如果沒有明確說一定要聲明無符號整型(要求優化性能、減少內存占用等),請使用系統默認的Int類型。因為系統默認整數類型的字面量默認的類型推斷也是Int類型。
5.1 整數之間的轉換
不同的整數類型存儲的范圍不同,可以通過max和min屬性得到。Int類型可以存儲的數值范圍:-128~127,UInt類型存儲的數值范圍:0~255。如果超出了這個范圍系統在編譯的時候就會報錯:
上邊這兩個錯誤就是說:你存儲的值溢出了當前這個類型所表示的范圍。
如果想要兩個不同整數類型的值進行操作的時候,必須要轉化成相同的類型:
let value1: UInt16 = 2_000 let value2: UInt8 = 1 let value3 = value1 + UInt16(value2)
5.2整數和浮點數轉換
整數和浮點數的轉換必須顯式指定類型:
let integerValue = 7 let fValue = 3.14 let fNumber = Double(integerValue) + fValue print("fNumber = \(fNumber)")
浮點類型同樣可以轉換成整數類型:
let integerNum = Int(fValue) print(integerNum)
注意:
數字類型的常量或變量進行運算,不同於數字字面量之間進行運算。數字字面量可以直接進行運算,比如3 + 0.1415,因為數字字面量本身沒有確定的類型,但是數字類型常量、變量是會被編譯器推斷出具體類型的,只有類型相同才能進行運算。
六、類型別名
類型別名(type aliases)就是給現有的類型定義一個新的名字。跟OC裡邊的typedef是類似。在Swift中你可以使用typealias關鍵字來定義類型別名。平常在開發的時候偶爾也會用到但是不多。類型別名在蘋果的Api裡邊大量的出現,特別是在一些地圖類、音視頻類等等的Api裡邊,經常會給現有類型起一個更有意義的別名。
比如:在GCD裡邊,如果想要某個線程延遲幾秒執行,你得先定義一個延遲時間dispatch_time_t ,你點擊進去查看Api就會發現其實它是UInt64類型:
下邊自己定義一個類型別名:
typealias requestTimeOut = Int var time:requestTimeOut = 10 time = 7 print(time) print(requestTimeOut.max)