雖然編寫任何編程語言,需要使用不同的變量來存儲各種信息。變量不過是保留的內存位置來存儲值。這意味著,當創建一個變量,在內存中會保留一些空間。
可能喜歡像存儲字符串,字符,寬字符,整數,浮點數,布爾等各種數據類型的信息。根據一個變量的數據類型,操作系統分配內存,并決定什么可以存儲保留在存儲器。
內置數據類型
Swift 為程序員提供內置以及用戶定義的種類數據類型。 以下是聲明變量使用最頻繁的基本數據類型的列表:
Int 或 UInt - 這是用于整數。更具體地可以使用Int32,Int64來定義32或64位有符號整數,其中作為UInt32或UInt64用來定義32或64位無符號整數的變量。 For example, 42 and -23.
- Float - 這是用來表示一個32位浮點數,一般用于使用較小的小數點數字。 例如:3.14159,0.1,和 -273.158。
- Double - 這是用來表示一個64位浮點數,用于非常大的浮點值。 例如: 3.14159, 0.1, 和 -273.158.
- Bool - 這代表一個布爾值,真或假。
- String - 這是有序字符集合。例如, "Hello, World!"
- Character - 這是一個單字符字符串。例如, "C"
- Optional - 這表示可以容納一個值或沒有任何值的變量。
有下列有關整數類型要點:
- 在32位的平臺上,Int 大小與 Int32 的大小相同。
- 在64位的平臺上,Int 大小與 Int64 的大小相同。
- 在32位的平臺上,UInt 的大小與 UInt32 的大小相同。
- 在 64 位的平臺上,UInt 的大小與 UInt64 的大小相同。
- Int8, Int16, Int32, Int64 可以用來表示 8 Bit, 16 Bit, 32 Bit 和 64 Bit 形成有符號整數。
UInt8, UInt16, UInt32 和 UInt64 可以用來表示 8 Bit, 16 Bit, 32 Bit 和 64 Bit 形成無符號整數。
綁定值
下表顯示變量類型,需要多少內存存儲此值在存儲器中,在這種類型的變量可以存儲最大值和最小值。
類型別名
可以從現有類型使用typealias創建一個新的名稱。以下是使用簡單 typealias 的語法來定義新類型:
typealias newname = type
例如,下面告訴編譯器Feet 是 Int 的另一個名字:
typealias Feet = Int
現在,下面的聲明是完全合法的,并創建一個整型變量為 distance:
import Cocoa
typealias Feet = Int
var distance: Feet = 100
println(distance)
當我們使用 playground 運行上面的程序,到以下結果。
1
|
100 |
類型安全
Swift 是一種安全的語言,這意味著,如果代碼的一部分需要一個字符串, 那么不能錯誤地傳遞一個int。
由于 Swift 是類型安全的,當類型檢查時它執行編譯代碼并標志類型不匹配的錯誤。
import Cocoa
var varA = 42
varA = "This is hello"
println(varA)
當我們編譯上面的程序它產生以下編譯時錯誤。
Playground execution failed: error: :6:6: error: cannot assign to 'let' value 'varA'
varA = "This is hello"
類型推斷
在它編譯代碼時,類型推斷使編譯器自動推導出特定表達式的類型, 簡單地通過檢查所提供的值。Swift 采用類型推斷制定出合適的類型如下。
import Cocoa
// varA is inferred to be of type Int
var varA = 42
println(varA)
// varB is inferred to be of type Double
var varB = 3.14159
println(varB)
// varC is also inferred to be of type Double
var varC = 3 + 0.14159
println(varC)
當我們使用 playground 運行上面的程序,得到以下結果。
1
2
3
|
42 3.14159 3.14159 |
Swift數字類型之間的轉換
Swift數字類型之間的轉換Swift是一種安全的語言,對于類型的檢查非常嚴格,不同類型之間不能隨便轉換。
一、整型之間的轉換
在C和Objective-C等其他語言中,整型之間有兩種轉換方法:
從小范圍數到大范圍數轉換是自動的;
從大范圍數到小范圍數需要強制類型轉換,有可能造成數據精度的丟失。
而在Swift中這兩種方法是行不通的,我們需要通過一些函數進行顯式地轉換,代碼如下:
let historyScore:UInt8 = 90
let englishScore:UInt16 = 130
let totalScore = historyScore + englishScore //錯誤 ①
let totalScore = UInt16(historyScore) + englishScore //正確 ②
let totalScore = historyScore + UInt8(englishScore) //正確 ③
上述代碼聲明和初始化了兩個常量historyScore和englishScore,我們把它們相加賦值給totalScore。如果采用第①行代碼實現相加,程序就會有編譯錯誤,原因是historyScore是UInt8類型,而englishScore是UInt16類型,它們之間不能轉換。
我們有兩種轉換方法。
一種是把UInt8的historyScore轉換為UInt16類型。由于是從小范圍數轉換為大范圍數,這種轉換是安全的。代碼第②行UInt16(historyScore)就是正確的轉換方法。
另外一種是把UInt16的englishScore轉換為UInt8類型。由于是從大范圍數轉換為小范圍數,這種轉換是不安全的,如果轉換的數比較大會造成精度的丟失。代碼第③行UInt8(englishScore)是正確的轉換方法。由于本例中englishScore的值是130,這個轉換是成功的,如果把這個數修改為1300,雖然程序編譯沒有問題,但是會在控制臺中輸出異常信息,這是運行期異常。
上述代碼中,UInt16(historyScore)和UInt8(englishScore)事實上是構造器,能夠創建并初始化另外一個類型。二、整型與浮點型之間的轉換
整型與浮點型之間的轉換與整型之間的轉換類似,因此我們將上一節的示例修改如下:
let historyScore:Float = 90.6 ①
let englishScore:UInt16 = 130 ②
let totalScore = historyScore + englishScore //錯誤 ③
let totalScore = historyScore + Float(englishScore) //正確,安全 ④
let totalScore = UInt16(historyScore) + englishScore //正確,小數被截掉 ⑤
上述代碼經過了一些修改,第①行代碼historyScore變量類型是Float類型。第②行代碼englishScore變量還是UInt16類型。其中第③行代碼直接進行了計算,結果有編譯錯誤。第④行代碼是將UInt16類型的englishScore變量轉換為Float類型,這種轉換是最安全的。第⑤行代碼是將Float類型的historyScore變量轉換為UInt16類型,這種轉換首先會導致小數被截掉,另外如果historyScore變量數很大,會導致運行期異常,這與整型之間的轉換是類似的。