基本型別
依據不同需求,變數或常數會需要不同的型別來執行動作,像是身高體重需要有小數點的數字,計算人數需要整數,姓名、名稱需要文字字串。
型別標註
宣告變數或常數時,可以加上型別標註(type annotation
),說明這個值的型別(像是整數、字串)。使用方法是在值的後面加上冒號 :
接著加上型別名稱,如下:
// 宣告一個整數變數
var number: Int
// 宣告一個字串常數
let str: String = "It is a string ."
通常很少需要寫型別標註,如果在宣告時給了一個初始值, Swift 則會自動推斷出型別。
整數
整數(Int
)指的是沒有小數點的數字,可以有符號 (正、負、零)或是無符號 (正、零)。
Swift 提供 8 、 16 、 32 和 64 位元的有符號的整數型別,依序為Int8
、Int16
、Int32
和Int64
,以及無符號的整數型別,依序是UInt8
、UInt16
、UInt32
和UInt64
。
另外也提供一個特殊的整數型別Int
,這個型別的長度與目前平台的原生字長相同,在 32 位元平台與Int32
相同,在 64 位元平台則與Int64
相同。
所以通常我們使用整數型別時,使用Int
即可。
let oneNumber = 12
var anotherNumber = -240
Hint
- 還有一個特殊的無符號整數型別為
UInt
,這個型別的長度與目前平台的原生字長相同。但基於程式碼的可重複性,避免不同型別數字之間的轉換,以及數字的型別推斷,大部分情況都建議只使用Int
即可。
浮點數
浮點數(Float
、Double
)指的是有包含小數點的數字,Float
跟Double
的差別在於精確度,Float
有 6 位數,而Double
可以達到 15 位數,選擇使用哪一個則是看你程式需要處理值的範圍而定,如下:
let piValue = 3.1415926
var height = 178.25
// 宣告浮點數時 如果沒有型別標註 通常會將他判斷為 Double
let oneHeight = 165.25 // 型別為 Double
let anotherHeight: Float = 175.5 // 除非型別標註填寫為 Float
整數和浮點數轉換
整數和浮點數的轉換必須指定型別。例子如下:
// 型別為整數 Int
let number1 = 3
// 型別為浮點數 Double
let number2 = 0.1415926
// 相加前 需要將 Int 轉換成 Double 否則會報錯誤
let pi = Double(number1) + number2
// 這個值的型別也就是 Double
// 印出:3.1415926
print(pi)
相反來說也行,可以將浮點數轉換成整數,但小數點後的數字就會被截斷。如下:
let integerPi = Int(pi)
// 型別為 Int 小數點後的數字被截斷
// 所以只會印出:3
print(integerPi)
布林值
布林值(bool
)指的是邏輯上的值,只能為真或假。在後續的學習中會使用到這個特性,依據一個條件式(像是數字比大小或兩數是否相等)會返回真或假,進而使用不同的程式碼。 Swift 有兩個布林常數:true
跟false
,如下:
let storeOpen = true
let forFree = false
字元及字串
字元(character
)指的是依照編碼格式的一個位元組(簡單來說就是一個英文字母、數字或符號),而字串(string
)是有序的字元集合(簡單說就是一段文字),皆是以一對雙引號"
前後包起來,如下:
let firstString = "Nice to meet you."
let secondString = "Nice to meet you,too."
// 宣告字串時 不論字數多少 都會判斷為 String
let str1 = "It is a string ." // 型別為 String
let str2 = "b" // 型別仍然是 String
let str3: Character = "c" // 除非型別標註填寫為 Character
如果要在字串中加入其他變數或常數,要使用 \()
這個方式,如下:
let score = 80
let string = "My score is \(score) ."
// 印出:My score is 80 .
print(string)
後面章節會介紹更多字串的操作。
元組
元組(tuple
)是將多個值組合成一個複合值,其內的型別可以不同,以一對小括號()
前後包起來,每個值以逗號,
分隔,如下:
// 宣告一個元組並填值進去 依序是字串、整數、浮點數
let myInfo = ("Kevin Chang", 25, 178.25)
要使用其中一個值,可以依照順序的索引值取得(這裡的順序從 0 開始算起,接著依序 1,2,3 ...),如下:
// 取得前面宣告的 myInfo 的第三個值 因為是從 0 開始算 所以是 2
let myHeight = myInfo.2
// 印出:My height is 178.25
print("My height is \(myHeight)")
也可將一個元組分解成單獨的常數或變數,如下:
// 將前面宣告的 myInfo 分解成三個常數
let (myName, myAge, myRealHeight) = myInfo
// 印出:My name is Kevin Chang .
print("My name is \(myName) .")
// 印出:I am 25 years old .
print("I am \(myAge) years old .")
如果只需要其中某些值時,分解時可以把不需要的用底線 _
標記,如下:
let (_, _, myTrueHeight) = myInfo
// 印出:My height is 178.25 .
print("My height is \(myTrueHeight) .")
或是在宣告元組時就個別給裡面的值一個名稱也可以,如下:
let herInfo = (name:"Jess", age:24, height:160.5)
// 除了用順序取得外 如果有設定名稱 也可以直接取用
// 印出:Her name is Jess .
print("Her name is \(herInfo.name) . ")
型別別名
型別別名(type aliases
)就是給已存在的型別定義另一個名字,必須使用關鍵字typealias
來定義型別別名。當你想要給已存在的型別命名一個更有意義的名字時很有用,底下是一個例子:
// 將 Int 型別定義一個新的名字 MyType
typealias MyType = Int
// 這時就可以宣告一個 MyType 變數 其實也就是 Int 變數
var someNumber: MyType = 123
可選型別
這是 Swift 的一個特性,讓變數或常數可以有沒有值的情況,這與零0
或是空字串""
不同,當沒有值時,變數或常數會返回nil
。而nil
代表的就是沒有值,任何型別只要有加上可選型別(optional type
)都可以設置成nil
。使用方法為在型別標註後面加上一個問號?
,如下:
// 在宣告變數時 型別標註後面加上一個問號 ?
var someScore: Int?
// 因為目前尚未指派 所以目前 score 會被設置成 nil
// 也就是沒有值的狀態
// 設值為 100
someScore = 100
// 再將變數設為 nil 目前又是沒有值的狀態
someScore = nil
// 但如果沒有加上 ? 則是尚未指派的狀態 這時如果直接使用會報錯誤
var totalScore: Int
// 也不能設成 nil 這行同樣也會報錯誤
//totalScore = nil
// 宣告常數也是一樣 在型別標註後面加上一個問號 ?
let someName: String?
以下是一個例子,來說明可能會遇到的可選型別的情況:
// 宣告一個字串常數
let numberValue = "5566"
// 嘗試將這個字串轉換成整數
let newNumber = Int(numberValue)
這時如果原字串內容不是單純的數字,轉換後則是會返回nil
,來避免發生錯誤的情況。也就是說返回的是一個可選型別Int?
,他可能會是整數,也可能是nil
。
強制解析
當你確認一個可選型別一定有值,則可以在這個變數後面加上一個驚嘆號!
,表示這個可選型別有值,請使用它,稱為強制解析(forced unwrapping
),例子如下:
// 宣告一個整數常數 並賦值
let number3: Int? = 500
// 以這個例子來說 常數確實有值
// 所以加上驚嘆號 表示這個可選型別有值 可以直接使用
print(number3!)
// 尚未賦值 所以目前是 nil
var number4: Int?
// 仍然要使用的話 下面這行則會報錯誤
//print(number4!)
隱式解析可選型別
當可選型別第一次被指派值後,如果可以確定他之後都會有值,這時可以將其改為隱式解析可選型別(implicitly unwrapped optional
),這樣便不需要每次都判斷及解析,作法則是將可選型別的問號?
改成驚嘆號!
,如下說明:
// 可選型別
let oneString: String? = "Good morning ."
// 需要驚嘆號來取值
let anotherString: String = oneString!
// 如果改成隱式解析可選型別
let twoString: String! = "Good night ."
// 則可以直接使用 不用加上驚嘆號
let finalString: String = twoString
範例
本節範例程式碼放在 ch1/types.playground