1. 事前準備
您有否發現手機的應用程式中,某些部分會維持不變,而其他部分會有變化 (或可以變動)。
例如,「設定」應用程式內的類別名稱 (如「網路與網際網路」、「已連結的裝置」、「應用程式」等) 是維持不變的。
另一方面,當您查看新聞應用程式時,新聞報導是瞬息萬變的。新聞標題、來源、發布時間和圖片都會變。
那您如何編寫程式,讓內容隨著時間改變?您不可能在每次要發布新文章時重新撰寫應用程式,因為每天、每小時甚至每分鐘都會有新文章!
您在這編碼實驗室,將會學到怎樣編寫利用變數的程式,從而程式某些部分可以變動,而無需編寫一套全新的指令。您將會如在先前的編碼實驗室,同樣使用 Kotlin Playground。
建立什麼
- 在 Kotlin 編寫利用變數的簡短程式。
課程內容
- 如何設定變數及更新變數的值。
- 如何從 Kotlin 的基本資料類型中,為變數選擇適當的資料類型。
- 如何在編碼中加入註解。
軟硬體需求
- 一台可連上網際網路並具備網路瀏覽器的電腦。
2. 變數和資料類型
電腦程式設計裡,有一個變數的概念,這是儲存單一資料的容器。您可以視之為內含值的盒子。這盒子上有變數名稱的標籤。只要參照盒子的名稱,就可以存取盒子儲存的值。
當您可以簡單地直接使用那個值時,為什麼要將值儲存在一個盒子內,並以盒子的名稱引用那個盒子呢?問題在於,當您的編碼於所有指令中直接使用值時,您的程式將僅適用於該特定情況。
這是讓您更容易解讀變數為何有用的比喻。以下是給您近期會面人物的信件,
Lauren,您好:
很高興今天在辦公室與您會面。期待星期五再見!
祝您愉快!
這信件很好,但只適用於 Lauren 這特定情況。如果您知道要寫同一封信好幾次,但收信人略有不同,該怎麼辦?建立一信件範本,留空可更改部分,應該會更有效率。
親愛的 ____:
很高興今天在 _____ 與您會面。期待 ____ 再見。
祝您愉快!
您還可以具體規定每個空格的資料類型。以確保信件範本,能符合預期地使用。
親愛的 { name }:
很高興今天在 { location } 與您會面。期待 { date} 再見。
祝您愉快!
這概念與編寫應用程式很類似。您為某些資料而預留位置,同時保持應用程式的其他部分不變。
以上新聞應用程式的圖示中,「歡迎」辭、「給您的最新消息」標題和「查看更多新聞」按鈕文字是維持不變的。然而,使用者名字與每篇報導的內容都會有所變更。因此,這是使用變數來為每種資訊預留位置的好機會。
您不希望編寫新聞應用程式 (或指令),只為只為名為「Alex」的使用者使用或新報導一直使用相同標題和發布日期。然而,您需要一個更靈活的應用程式,並因此您應該以引用變數名稱來寫編碼,例如 name
、article1Name
和 article1Date
等。您的編碼因此變得非專門的,可以用於不同使用者名稱和報導內容的各個情況。
利用變數的應用程式範例
我們來看看一個應用程式範例,查看它在那裡可能使用變數。
在 Google 地圖應用程式,您可以看到每個地點的詳細資料畫面,例如餐廳或商家。上方 Google 地圖應用程式螢幕截圖,顯示 Google 公司總部 (稱為 Googleplex) 的詳細資料。您覺得哪些應用程式儲存的資料是變數?
- 地點的 名稱
- 地點的 星級評價
- 地點的 評論數量
- 用戶是否 曾儲存 (或加入書籤) 這地點
- 地點的 地址
- 地點的 描述
只要更改儲存在這些變數中的資料,您便可有一個靈活的地圖應用程式,它可以顯示其他地點的詳細資料。
資料類型
當您決定應用程式的那些方面是變數時,請務必規定那些資料類型可以儲存在變數中。在 Kotlin,常見基本資料類型如下。下表列出每列的不同資料類型。每種資料類型都有自己可以儲存那種資料的描述,以及範例值。
Kotlin 的資料類型 | 可以儲存什麼類型的資料 | 文字值範例 |
| 文字 |
|
| 整個整數 |
|
| 小數 |
|
| 小數 (不如 |
|
|
|
|
您現在已經瞭解一些常見的 Kotlin 資料類型,那您之前看到的位置詳細資料頁面中,每個已確定的變數,適合哪種資料類型?
- 位置的 名稱 是文字,因此可儲存在資料類型為
String.
的變數中。 - 地點的 星級評價 是小數 (例如 4.2 顆星),因此可以儲存為
Double
。 - 地點的 評論數量 是整數,因此應該以
Int
的形式儲存。 - 這使用者是否 儲存 那個位置有兩個可能的值 (已儲存或未儲存),因此會儲存為
Boolean
,而其中true
和false
可以代表各個狀態。 - 地點的 地址 是文字,因此應該是
String
。 - 地點的 描述 也是文字,因此應為
String
。
在以下兩個情境中練習。在下列應用程式中,找出所用的變數及資料類型。
- 您可以透過應用程式觀看影片 (例如 YouTube 應用程式),畫面上會顯示影片的詳細資料。哪裡可能使用了變數?這些變數的資料類型是什麼?
雖然目前沒有單一正確答案,但在影片應用程式中,變數可用於下列資料:
- 影片的 名稱 (
String
) - 頻道的 名稱 (
String
) - 影片的 觀看次數 (
Int
)。 - 影片的 按讚數量 (
Int
) - 影片 留言數量 (
Int
)
- 在 Gmail 等電子郵件應用程式中,收件匣畫面會列出最近收到的電子郵件。哪裡可能使用了變數?這些變數的資料類型是什麼?
同樣,沒有單一正確答案。在電子郵件應用程式中,變數可用於下列資料:
- 寄件者的 名稱 (
String
) - 電郵的 主旨 (
String
) - 電郵是否 加上星號 (
Boolean
) - 收件匣的 新郵件數量 (
Int
)
試用
- 在手機上開啟您最愛的應用程式。
- 在那個應用程式某個螢幕截圖中,找出各個使用變數的位置。
- 猜測這些變數的資料類型。
- 請在社群媒體分享您的答案和應用程式的 螢幕截圖,並說明應用程式那部分使用了變數,並加上 #AndroidBasics 標籤。
目前為止,這編碼實驗室的成果很棒!請移至下一節,進一步瞭解您的編碼中,變數和資料類型的使用方式。
3. 定義和使用變數
定義和使用變數
您必須先在編碼中定義變數,才能使用這變數。這類似您在之前的編碼實驗室中,學到使用函數前,要先定義函數。
當您定義變數時,您需要給變數一個獨一無二的名稱。您還可以通過規定變數的資料類型,以決定變數可以儲存的資料類型。最後,您可以在變數中儲存一個初始值,但這是非強制的。
當您定義變數後,就可以在您的程式中 使用 那個變數。如要使用變數,請在編碼中輸入變數名稱,以便 Kotlin 編譯器在編碼中,使用那個變數的值。
例如,您可以在用戶收件匣中,定義未讀郵件數量的變數。變數的名稱可以是「count
」。在變數內儲存一個值,例如數字 2
,代表用戶收件匣內有 2
封未讀郵件。(您可以在變數中儲存其他數字,但為了達到本範例的目的,請使用數字 2
。)
每當您的編碼需要存取未讀郵件的數量時,請在您的編碼中輸入 count
。當您運行指示時,Kotlin 編譯器會在您的編碼中,看見變數名稱,並在變數值所在位置,使用變數值。
在技術上,您需要更具體的詞彙來描述這過程:
表式 是一組含有值的小編碼單元。表式可以由變數、函數呼叫和其他組成。在下列範例中,表式 是由一個變數組成:count
變數。表式的值是 2
。
評估 代表確定表式的值。在這範例中,表式評估為 2
。編譯器在編碼中評估表式,並在程式中運行各種指示時,使用這些值。
如果要在 Kotlin Playground 中觀察這行為,請在下一節運行程式。
範例
- 在網頁瀏覽器開啟 Kotlin Playground。
- 在 Kotlin Playground 中,使用下列程式,以取代現有編碼。
這程式建立名為 count
的變數,它的初始值為 2
,然後列印這個 count
變數的值至輸出,以便使用這個變數。如果您對編碼語法各方面還是不太清楚,請不要擔心。我們會在後續的章節中,詳細說明。
fun main() {
val count: Int = 2
println(count)
}
- 運行程式,輸出結果應該如下:
2
變數宣告
在您運行的程式中,編碼的第二列顯示:
val count: Int = 2
這個敘述建立名為 count
的整數變數,當中含有數字 2
。
Kotlin 讀取那個變數的語法 (或格式) 時,可能需要一些時間。下圖顯示與那個變數適當位置相關的各種詳細資料,以及空格和符號的位置。
在 count
變數範例的情境,您可以看到變數宣告的首字母是 val
。這個變數的名稱是 count
。資料類型是 Int
,而初始值是 2
。
下文將詳細說明變數宣告的每個部分。
定義新變數的關鍵字
請先輸入 Kotlin 關鍵字 val
(它代表值),以定義新變數。然後,Kotlin 編譯器認出這敘述內有變數宣告。
變數名稱
就像函數名稱一樣,您也可以為變數命名。在變數宣告中,變數名稱跟隨 val
關鍵字。
您可以選擇任何想要的變數名稱,但建議您避免使用 Kotlin 關鍵字做為變數名稱。
最好選擇一個描述變數所儲存資料的名稱,以便讀取您的編碼。
變數名稱應該以駝峰式命名,就如您從函數名稱學到的一樣。變數名稱的第一個字是小寫。如果名稱中出現多個字,字之間不可以是空格,而所有其他字的首字母都必須是大寫字母。
變數名稱範例:
numberOfEmails
cityName
bookPublicationDate
早前的編碼範例中,變數的名稱是 count
。
val count: Int = 2
變數資料類型
在變數名稱之後,新增一個冒號和空格,然後是變數的資料類型。如先前所述,String
、Int
、Double
、Float,
和 Boolean
是 Kotlin 的基本資料類型。本課程稍後將會介紹更多資料類型。切記準確拼寫資料類型,並首字母為大寫。
對於 count
變數範例,Int
是變數的資料類型。
val count: Int = 2
指定運算子
在變數宣告中,等號 (=
) 跟隨資料類型。等號被稱為 指定運算子。指定運算子為變數指定值。換句話說,等號右邊值的變數會儲存在等號左邊的變數中。
變數初始值
變數值是儲存在變數中的實際資料。
對於 count
變數範例,變數的初始值是數字 2
。
val count: Int = 2
您可能也會聽到「count
變數已初始化為 2
」。這表示 2
是宣告變數時儲存在變數中的第一個值。
初始值會因變數宣告的資料類型而不同。
您可能從早前的編碼實驗室認出下表資料。第三列顯示每個相應類型變數可以儲存的範例值。這些值稱為文字,因為這些值是固定值或定值 (這值是保持不變)。例如,整數 32 的值一直是 32。相反地,變數並非值,因為變數的值可能會變動。您可能會聽到這些文字值,以它們的類型引用:字串文字、整數文字和布林文字等。
Kotlin 的資料類型 | 可以儲存什麼類型的資料 | 文字值範例 |
| 文字 |
|
| 整個整數 |
|
| 小數 |
|
| 小數 (不如 |
|
|
|
|
請務必根據變數的資料類型,提供適當而有效的值。舉例來說,您不能在 Int
類型的變數中儲存 "Hello"
這類字串文字,因為 Kotlin 編譯器會告知您這是錯誤的。
使用變數
以下是您在 Kotlin Playground 運行的原始程式。目前為止,您已知道第二列編碼建立一個名為 count
並值為 2
的新整數變數。
fun main() {
val count: Int = 2
println(count)
}
現在,請查看第三列編碼。您將 count
變數列印出至輸出:
println(count)
請注意,count
這個單字前後是沒有引號的。這是變數名稱,不是字串文字。 (如果它是字串文字,您會在單字周圍找到引號。)運行程式時,Kotlin 編譯器會評估括號內表式 count
,也就是 println()
指令。由於表式評估為 2
,因此 println()
方法是調入 2
作輸入:println(2)
。
因此,程式的輸出是:
2
輸出的數字本身並不是很有用。在輸出中,列印更詳細的資料,以解釋 2
的意思,可能更有幫助。
字串範本
在輸出中,顯示更有用的訊息:
You have 2 unread messages.
請按照以下步驟操作,讓程式輸出更有用的訊息。
- 請使用下列編碼,以更新您在 Kotlin Playground 中的程式。對於
println()
調入,請傳送包含count
變數名稱的字串文字。請務必在文字前後加上引號。請注意,這樣做無法達到您預期的結果。我們會在稍後的步驟中,修正問題。
fun main() {
val count: Int = 2
println("You have count unread messages.")
}
- 運行程式,輸出應該會顯示:
You have count unread messages.
「That sentence doesn't make sense! 」您希望在訊息中顯示 count
變數的值,而非變數名稱。
- 如要修正程式,請在
count
變數之前加上錢幣記號$
:"You have $count unread messages."
這是一個「字串範本」,因為其中包含「範本表式」,在本範例中即為$count
。範本表式會經過評估以得出值,然後替換到字串中。在這範例中,範本表式$count
會評估為2
,而2
會替換字串內該表式所在的位置。
fun main() {
val count: Int = 2
println("You have $count unread messages.")
}
- 當您運行程式時,輸出與預期目標相似:
You have 2 unread messages.
這句對用戶更易於理解!
- 現在,請變更
count
變數的初始值為其他整數文字。例如,您可以選擇數字10
。保持程式中其他編碼不變。
fun main() {
val count: Int = 10
println("You have $count unread messages.")
}
- 運行程式。請注意,輸出會隨之變更,您無須變更程式中的
println()
敘述。
You have 10 unread messages.
您可以查看字串範本的實用程度。您只需在編碼中 ("You have $count unread messages."
) 編寫一次字串範本。假如您變更 count
變數的初始值,println()
敘述仍然有效。現在,您的編碼更具彈性!
若要進一步強調這點,請比較以下兩個程式。下面的第一個程式使用字串文字,直接在字串中包含未讀郵件的實際數量。本程式僅適用於用戶有 10 則未讀郵件。
fun main() {
println("You have 10 unread messages.")
}
下面的第二個程式,透過使用變數和字串模板,您的編碼可以適用更多的情節。第二個程式更具彈性!
fun main() {
val count: Int = 10
println("You have $count unread messages.")
}
型式推理
您可以在宣告變數時,利用下方的提示,編寫更少的編碼。
型式推理是 Kotlin 編譯器可以推理 (或確定) 變數應該是什麼資料類型,而無需在編碼明確寫入類型。也就是說,如果您提供變數的初始值,就可以省略變數宣告中的資料類型。Kotlin 編譯器查看初始值的資料類型,並假設您希望那個變數是初始值那個資料類型。
以下是使用型式推理的變數宣告語法:
回到計算範例,程式起始時會包含這列編碼:
val count: Int = 2
不過,這列編碼也可以如下編寫。請注意,省略冒號 (:
) 和 Int
資料類型。更新後的語法需要輸入的字數更少,並且達到與建立一個 Int
變數的相同結果,而變數的名稱是 count
,它的值是 2
。
val count = 2
Kotlin 編譯器知道您想將 2
(整數) 儲存至變數 count
內,因此可以推理 count
變數的類型是 Int
。很方便,對吧?這是更簡潔的 Kotlin 編碼編寫範例!
儘管這範例只討論 Int
類型的變數,但 Kotlin 中的型式推理概念適用於所有資料類型。
使用整數的基本數學運算
包含 2
值的 Int
變數和包含 "2"
值的 String
變數有何差異?兩者列印至輸出後,看起來都一樣。
將整數儲存為 Int
的優勢 (與 String
不同),您可以使用 Int
變數執行數學運算,例如加法、減法、除法和乘法 (請參閱其他 運算子)。舉例來說,您可以將兩個整數變數加起來,以它們的總數。在某些情況下,將整數儲存為字串是很合理的,但本節的目的是說明 Int
變數的用途。
- 返回 Kotlin Playground,並在編碼編輯器中移除所有編碼。
- 建立一個新程式,以便為收件匣中未讀取電子郵件定義整數變數,並將其初始化為一個值,例如
5
。您可以任意選擇其他號碼。為收件匣的已讀郵件數量定義第二個整數變數。將其初始化為一個值,例如100
。您可以任意選擇其他號碼。將兩個整數加起來,列印出收件匣中的訊息總數。
fun main() {
val unreadCount = 5
val readCount = 100
println("You have ${unreadCount + readCount} total messages in your inbox.")
}
- 運行程式,應該會顯示收件匣的郵件總數:
You have 105 total messages in your inbox.
對於字串範本,您已認識到您可以在單一變數名稱之前,放置這個 $
符號。但是,如果您有更複雜的表式,則必須使用這 $
符號,將表式括在大括號內,並在大括號前加上符號:${unreadCount + readCount}
。大括號內的表式 unreadCount + readCount
評估為 105
。接著,字串常值會替換為 105
值。
- 要進一步探索此主題,請以不同名稱和不同初始值建立變數,並使用範列表式,以列印訊息至輸出。
例如,修改您的程式,並列印出來:
100 photos 10 photos deleted 90 photos left
這是您可以編寫程式的一種方法,儘管還有其他正確編寫程式的方法!
fun main() {
val numberOfPhotos = 100
val photosDeleted = 10
println("$numberOfPhotos photos")
println("$photosDeleted photos deleted")
println("${numberOfPhotos - photosDeleted} photos left")
}
4. 更新變數
應用程式運行時,可能需要更新變數值。舉例來說,用戶在購物應用程式中,將商品加入購物車時,購物車的總金額會增加。
讓我們簡化購物流程,並換為簡單的程式。下面的邏輯是用人類語言來寫的,而不是用 Kotlin 寫的。這個方法稱為虛擬程式碼,因為它描述如何編寫程式碼的關鍵點,但它並不包含程式碼的所有細節。
虛擬程式碼在程式中的主要功能:
- 建立一個起始值為
0
的整數cartTotal
變數。 - 用戶將一件價值 20 元的毛衣加入購物車。
- 將
cartTotal
變數更新為20
,此為現時購物車中的商品總額。 - 列印購物車中的商品總額
cartTotal
變數至輸出內容。
為了進一步簡化編碼,當用戶將商品加入購物車時,您不需要撰寫這編碼。(您還沒學習程式如何可以回應用戶的輸入。這將會在之後的單元談到。)因此,請將重點放在您建立、更新及列印 cartTotal
變數的部分。
- 請使用下列程式,以取代 Kotlin Playground 中的現有編碼。在程式的第 2 列中,您會將
cartTotal
變數初始化為0
。由於您提供了初始值,加上型式推理,所以不需要指定Int
資料類型,在程式的第 3 列中,您嘗試以指定運算子 (=
),更新cartTotal
變數為20
。在程式的第 4 列中,您可以使用字串範本,列印出cartTotal
變數。
fun main() {
val cartTotal = 0
cartTotal = 20
println("Total: $cartTotal")
}
- 運行程式,您會收到編譯錯誤。
- 請注意,錯誤訊息表示無法再指定
val
。錯誤在程式的第三列,它試圖將變數的值cartTotal
更改為20.
。當它指定初始值 (0
),val
cartTotal
不可以再指定給其他值 (20
)。
Val cannot be reassigned
如您需更新變數的值,請使用 Kotlin 關鍵字 var
來宣告變數,而非 val
。
val
個關鍵字 - 當您預期那變數值不會改變時才使用。var
關鍵字 - 當您預期那變數值可能變更時使用。
使用 val
時,變數為 唯讀,這表示您只能讀取或存取變數的值。設定那個值後,您將無法編輯或修改它的值。使用 var
時,變數是 可變的,這代表這個值是可以變更或修改的。那個值可以是可變的。
請視 val
為固定的 值,並視 var
為 變數,以記住當中差異。在 Kotlin 中,建議盡量使用 val
關鍵字,而非 var
關鍵字。
- 為第 2 列的
cartTotal
更新變數宣告為使用var
,而非val
。這是編碼的外觀是:
fun main() {
var cartTotal = 0
cartTotal = 20
println("Total: $cartTotal")
}
- 請注意,這個語法,是用來更新程式第 3 列編碼的變數。
cartTotal = 20
使用指定運算子 (=
) 為現有變數 (cartTotal
) 指定新的值 (20
)。因為變數已定義,所以您不需要再次使用「var
」關鍵字。
使用這盒子類比,想像 20
值儲存在標有 cartTotal
的盒子內。
這圖表示一個變數的一般更新語法,而當中的變數已在早前的程式碼列中宣告過。您要更新的變數,敘述以變數名稱起始。新增空格和等號,跟隨的是另一個空格。然後寫出變數的更新值。
- 運行程式,而應該成功編譯編碼。應該可以列印這輸出:
Total: 20
- 如要查看程式運行期間的變數值變化,請在初始宣告變數後,將
cartTotal
變數列印至輸出內容。請參閱下方的編碼變更。第 3 列有一個新println()
敘述。還在編碼的第 4 列新增一條空白列。空白列不會影響編譯器如何解讀編碼。新增一條空白列,以分離相關的碼塊,您便更容易解讀您的編碼。
fun main() {
var cartTotal = 0
println("Total: $cartTotal")
cartTotal = 20
println("Total: $cartTotal")
}
- 再次運行程式,輸出應該如下:
Total: 0
Total: 20
您可以看到購物車初始總金額為 0
。然後更新為 20
。您已成功更新變數!這可能是因為您將 cartTotal
由唯讀變數 (附 val
),變更為可變的變數 (附 var
)。
請記得,如果您預期那個值會變化,請只使用 var
來宣告變數。否則,您應該預設使用 val
來宣告變數。這種做法會確保您的編碼更加安全。如果您不希望更新變數,請使用 val
確保變數不會在您的程式中更新。當 val
值被指定後,它就會保持這個值。
遞增和減量運算子
現在,您知道必須宣告變數為 var
,才能更它的值。於下列稔熟的電子郵件範例,應用這些知識。
- 以這程式取代 Kotlin Playground 中的編碼:
fun main() {
val count: Int = 10
println("You have $count unread messages.")
}
- 運行程式。它應該可以列印出來:
You have 10 unread messages.
- 取代
val
關鍵字為var
關鍵字,以將count
變數設定為可變動的變數。運行程式時,輸出應該沒有變化。
fun main() {
var count: Int = 10
println("You have $count unread messages.")
}
- 但是,您現在可以更新
count
為不同的值。例如,當收件匣收到一封新電子郵件時,您可以count
增加 1。(您不需要在收到電子郵件後撰寫編碼。對於後面的單元來說,從網際網路獲取資料是一個比較進階的題目。)現階段,請聚焦在count
變數,並使用以下列編碼來增加1
:
count = count + 1
等號右邊的表式為 count + 1
,評估為 11
。這是因為目前的 count
值是 10
(位於程式第 2 列),而 10 + 1
等於 11
。然後使用指定運算子,指定 11
值或將值儲存在 count
變數中。
新增這列編碼至您程式中 main()
函數的底部。您的編碼應該會如下:
fun main() {
var count = 10
println("You have $count unread messages.")
count = count + 1
}
如果您現在運行程式,輸出會與先前的一樣。這是因為您更新編碼後,尚未新增任何編碼來使用這個 count
變數。
- 請新增另一個列印敘述,以在變數更新後,列印未讀郵件的數量。
fun main() {
var count = 10
println("You have $count unread messages.")
count = count + 1
println("You have $count unread messages.")
}
- 運行程式。第二則訊息應該會顯示從
11
封郵件,已更新count
封郵件。
You have 10 unread messages. You have 11 unread messages.
- 簡而言之,如果想變數增加
1
,可以使用使用兩個加號組成的遞增運算子 (++
)。您可以直接在變數名稱後面使用這些符號,以告訴編譯器您要變數目前的值加 1,然後儲存新的值至變數中。以下兩列編碼是等同的,但使用++
遞增運算子涉及較少輸入。
count = count + 1
count++
對您的編碼作此修改,然後運行您的程式。變數名稱與遞增運算子之間不應該有空格。
fun main() {
var count = 10
println("You have $count unread messages.")
count++
println("You have $count unread messages.")
}
- 運行程式。輸出相同,但您現已學會新的運算子!
You have 10 unread messages. You have 11 unread messages.
- 現在可以修改程式第 4 列,並在
count
變數名稱後面,使用 減量運算子 (--
)。減量運算子是由兩個減號組成。您可以透過在變數名稱後面放置減量運算子,告訴編譯器您要將變數的值減少1
,並儲存新的值至變數中。
fun main() {
var count = 10
println("You have $count unread messages.")
count--
println("You have $count unread messages.")
}
- 運行程式。應該可以列印以下輸出:
You have 10 unread messages. You have 9 unread messages.
在本節中,您會學會如何使用遞增運算子 (++
) 和減量運算子 (--
),以更新可變更的變數。更明確地說,count++
與 count = count + 1
相同,而 count--
與 count = count - 1
相同。
5. 探索其他資料類型
我們在先前的編碼實驗室中,介紹了幾個常見的基本資料類型:String
、Int
、Double
和 Boolean
。您剛剛使用的是 Int
資料類型,現在將會探索其他資料類型。
Kotlin 的資料類型 | 可以儲存什麼類型的資料 |
| 文字 |
| 整個整數 |
| 小數 |
|
|
請在 Kotlin Playground 中,試用這些程式,看看輸出什麼。
雙倍精度
當您需要含小數的變數,請使用 Double
變數。請參閱 這份表格,以查看用戶為範例可儲存的小數和瞭解它的有效範圍。
想像一下,您正在導航到某個目的地。因為您需要在旅程途中停下來,所以您的旅程分成三個獨立部分。這程式顯示前往目的地所需的總距離。
- 在 Kotlin Playground 中輸入這編碼。您知道每一列編碼的內容嗎?
fun main() {
val trip1: Double = 3.20
val trip2: Double = 4.10
val trip3: Double = 1.72
val totalTripLength: Double = 0.0
println("$totalTripLength miles left to destination")
}
宣告三個名為 trip1
、trip2
和 trip3
的變數,以代表旅程各段的距離。因為它們儲存小數值,所以它們全部都是 Double
變數。請使用 val
來宣告每個變數,因為在整個程式中,它們的值都不會改變。程式還會建立名為 totalTripLength
的第四個變數,目前已初始化為 0.0
。程式最後一列會顯示 totalTripLength
值的訊息。
- 請修正編碼,使
totalTripLength
變數為這三個旅程長度的總和。
val totalTripLength: Double = trip1 + trip2 + trip3
因為 3.20 + 4.10 + 1.72
等於 9.02
,所以等號右邊的表式評估為 9.02
。儲存 9.02
的值至 totalTripLength
變數中。
您整個程式應該類似以下編碼:
fun main() {
val trip1: Double = 3.20
val trip2: Double = 4.10
val trip3: Double = 1.72
val totalTripLength: Double = trip1 + trip2 + trip3
println("$totalTripLength miles left to destination")
}
- 運行程式。應該可以列印以下輸出:
9.02 miles left to destination
- 因為型式推理,請修正您的編碼,以從變數宣告中,刪除不必要的
Double
資料類型。Kotlin 編譯器可以根據初始值提供的小數,而推理這些變數是Double
資料類型。
fun main() {
val trip1 = 3.20
val trip2 = 4.10
val trip3 = 1.72
val totalTripLength = trip1 + trip2 + trip3
println("$totalTripLength miles left to destination")
}
- 再次運行您的編碼,以確保您的編碼仍然可編譯。輸出應該是一樣的,但是您的編碼現在比較簡單!
字串
當您需要可以儲存文本的變數時,請使用 String
變數。請記住在字串文字值,例如 "Hello Kotlin"
,使用引號。然而,Int
和 Double
文字值則沒有引號。
- 請複製這程式和貼到 Kotlin Playground。
fun main() {
val nextMeeting = "Next meeting is:"
val date = "January 1"
val reminder = nextMeeting + date
println(reminder)
}
請注意,有兩個已宣告的 String
變數、一個nextMeeting
變數和一個 date
變數。然後宣告名為 reminder
的第三個 String
變數,它被設定為等於 nextMeeting
變數加上 date
變數。
您可以使用 + 符號,將兩個字串相加,這稱為「串連」。兩個字串會一個接一個,合併在一起。表式 nextMeeting + date
的結果是 "Next meeting is:January 1"
,如下圖所示。
然後,使用程式第 4 列的指定運算子,將這個值 "Next meeting is:January 1"
儲存至 reminder
變數中。
- 運行程式。應該可以列印以下輸出:
Next meeting is:January 1
當您將兩個字串連接在一起時,不要在字串之間加入額外空格。如果您希望在結果字串的冒號後有一個空格,則需要將空格加到一個字串或其他字串。
- 請更新您的
nextMeeting
變數,讓它在字串末端和關引號前有一個額外的空格。(或者,您可以在date
變數的開頭,加上一個額外空格)。您的程式應該如下所示:
fun main() {
val nextMeeting = "Next meeting is: "
val date = "January 1"
val reminder = nextMeeting + date
println(reminder)
}
- 再次運行您的程式,現在輸出訊息中的冒號後面應該有一個空格。
Next meeting is: January 1
- 請您修改編碼,以便連接或新增另一段文本至儲存在變數中的表式
reminder
變數中。
使用這 +
符號,以將字串文字 "at work"
加至 reminder
字串的末端。
- 運行程式。
應該可以列印以下輸出:
Next meeting is: January 1 at work
以下編碼為您展示一種您可以實施那個行為的方法。
fun main() {
val nextMeeting = "Next meeting is: "
val date = "January 1"
val reminder = nextMeeting + date + " at work"
println(reminder)
}
請注意,nextMeeting
和 date
前後並未加上引號,因為它們是現有字串變數的名稱 (它們各自的值是引號括住的文字)。反之,由於那文字 "at work"
先前並未定義任何變數,所以請在文字前後加上引號,以確保編譯器知道這字串應該連接其他字串。
從技術上,您可以透過使用全文宣告單一 String
變數,而不是使用獨立的變數,以達到相同的輸出。但是,本練習的目的是示範如何宣告和操作 String
變數,特別是如何連接獨立的字串。
- 當您讀取含有字串的編碼時,可能會遇到 逸出順序。逸出順序是前面加上倒斜線符號 (
\
) 的字元,也稱為逸出倒斜線。
下列是在字串文字中看到 \"
的範例。複製這段編碼並貼到 Kotlin Playground。
fun main() {
println("Say \"hello\"")
}
您已經學會如何使用雙引號標註字串常值。但是,如果您想在字串中使用 "
符號的話該怎麼做呢?您需要在字串的雙引號前方加上反斜線,標註為 \"
。切記,整個字串兩端都應該要有雙引號。
- 運行程式,以查看輸出。應該會顯示:
Say "hello"
在輸出內容中,由於 println()
陳述式的 hello
前後兩端都有加上 \"
,因此 hello
的兩端可以顯示雙引號。
如要瞭解其他 Kotlin 支援的逸出順序,請參閱逸出序列說明文件頁。舉例來說,如果您想為字串新增一行,可在 n 字元前方加上 \
符號,也就是 \n
。
現在,您已經學會串連字串,以及字串中的逸出序列。轉到這編碼實驗室涵蓋的最後資料類型。
布林
當您的變數只有 true
或 false
代表的兩個可能值時,Boolean
資料類型就很有用。
一個範例是一個變數,它表示裝置的飛行模式是打開還是關閉,或者應用程式的通知是啟用還是停用。
- 在 Kotlin Playground 中輸入這編碼。在這程序的第 2 列中,您宣告了一個名為
notificationsEnabled
的Boolean
變數,並初始化這個變數為true
。從技術上,您可以在宣告中省略: Boolean
,因此您可以根據自己的意願來移除它。在程式的第 3 列中,您列印出這notificationsEnabled
變數的值。
fun main() {
val notificationsEnabled: Boolean = true
println(notificationsEnabled)
}
運行程式,然後列印出來的應該如下:
true
- 變更在程式第 2 列的
Boolean
初始值為 false。
fun main() {
val notificationsEnabled: Boolean = false
println(notificationsEnabled)
}
運行程式,然後列印出來的應該如下:
false
- 其他資料類型可以連接到
Strings
。例如,您可以連接Booleans
到Strings
。使用這+
符號,以連接 (或附加)notificationsEnabled
布林變數的值到"Are notifications enabled? "
字串的末端。
fun main() {
val notificationsEnabled: Boolean = false
println("Are notifications enabled? " + notificationsEnabled)
}
運行程式,以查看連接結果。程式應該列印的輸出如下:
Are notifications enabled? false
您可以看到將 Boolean
變數設定為 true
或 false
值。當執行部分 Boolean
變數有 true
值的指示時,Boolean
變數可以讓您編寫更多有趣的情境。或者,如果 Boolean
有一個假值,則可跳過這些指令。您會在未來編碼實驗室瞭解更多 Booleans
。
6. 編碼慣例
我們在先前的編碼實驗室介紹過 Kotlin 式樣導引,以協助您按照 Google 建議和其他專業開發者使用的方法,來撰寫 Android 程式碼。
根據您學到的新主題,您可以使用以下其他格式和編碼規約:
- 變數名稱應該是駝峰式,首字母必須是小寫。
- 您在變數宣告中指定資料類型時,冒號後面應該有一個空格。
- 指定(
=
)、加法 (+
)、減法 (-
)、乘法 (*
)和除法 (/
)等運算子的前後,應該有一個空格。
- 當您編寫更複雜的程式時,建議 每列最多 100 個字元。這確保您可以在電腦螢幕上輕鬆閱讀程式中的所有程式碼,而無須在閱讀程式碼時水平捲動畫面。
7. 在編碼中加註解
編寫程式碼時,我們也建議您加上註解說明程式碼的用途。註解有助於讓閱讀程式碼的使用者更容易瞭解程式碼內容。兩條斜線或 //
表示該列其餘部分的文本被視為註解,因此它不會被解譯為程式碼。一般做法是在兩條斜線後面加上空格。
// This is a comment.
註解也可以從一列編碼的中間開始。在這範例中,height = 1
是一個正常的編碼敘述。在 //
或 Assume the height is 1 to start with
後的所有內容都被解譯為註解,不算是編碼的一部分。
height = 1 // Assume the height is 1 to start with.
如果您想用一列超過 100 個字元的長註釋,以便更詳細地描述程式碼,請使用多列註釋。以斜線 (/
) 和星號 (*
) 開始多列註解 (/*
)。在每列註解的開頭加上星號。最後,用星號和斜線 */
來結束註釋。
/*
* This is a very long comment that can
* take up multiple lines.
*/
這程式包含描述正在發生事情的單列和多列註釋:
/**
* This program displays the number of messages
* in the user's inbox.
*/
fun main() {
// Create a variable for the number of unread messages.
var count = 10
println("You have $count unread messages.")
// Decrease the number of messages by 1.
count--
println("You have $count unread messages.")
}
如前所述,您可以在編碼中新增空白列,將相關敘述組合在一起,使編碼更容易閱讀。
- 請在早前使用的編碼片段中加上一些註解。
- 運行程式,以確保行為沒變,因為註解不會影響輸出。
8. 結語
很捧!您已經暸解 Kotlin 中的變數、變數在程式設計中相當實用的原因,以及如何建立、更新及使用變數。您在 Kotlin 中測試了不同的基本資料類型,包括 Int
、Double
、String
和 Boolean
資料類型。您還瞭解 val
和 var
關鍵字之間的差異。
所有這些概念都是您在成為開發者的旅程上,關鍵的構建塊。
下一個編碼實驗室見!
摘要
- 變數是單一資料的容器,
- 您必須先宣告變數,才能使用變數。
- 使用
val
關鍵字來定義唯讀變數,而它的值在指定後是無法變更。 - 使用
var
關鍵字來定義可變的或常變的變數。 - 在 Kotlin 中,建議盡可能使用
val
而非var
。 - 如要宣告變數,請開頭使用
val
或var
關鍵字開始。然後指定變數名稱、資料類型和初始值。例如:val count: Int = 2
。 - 使用型式推理時,如果提供了初始值,則在變數宣告中省略數據類型。
- 常見的基本 Kotlin 資料類型包括:
Int
、String
、Boolean
、Float
和Double
。 - 宣告或更新變數時,使用指定運算子 (
=
) 為變數指定值。 - 您只能更新已宣告為可變的變數 (帶有
var
)。 - 使用增量運算子 (
++
) 或減量運算子 (--
),將整數變數的值增加或減少 1。 - 使用
+
符號將字串連接在一起。您還可以將其他資料類型,例如Int
和Boolean
,連接到Strings
。