iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
Mobile Development

從零開始以Flutter打造跨平台聊天APP系列 第 2

Day-2 Dart 簡介(1):變數、流程控制

  • 分享至 

  • xImage
  •  

Generated from Stable Diffusion 3 Medium

這篇文章假定讀者對於程式語言有基本的了解,若您本身已經對 Java 及 Javascript 有一定的程度,那麼恭喜您,Dart 對您來說會相當容易上手!

程式碼:https://github.com/ksw2000/ironman-2024

變數

在 Dart 中,可以像 Javascript 一樣直接以 var 宣告變數,Dart 會自動推論該變數之型別。當然也可以像 Java 在變數名稱前加入型別名稱。Dart 屬於強型別的語言,因此在宣告後不可以像 Javascript 一樣對變數更改型別。

以下是 dart 提供的內建型別,本文僅會先介紹前 3 個基礎型別!

  • 數字(int、double)
  • 字串(String)
  • 布林值(bool)
  • 記錄((value1, value2))
  • 清單(List,也稱為陣列)
  • 集合 (Set)
  • 映射 (Map)
  • 符文 (Runes;通常由 characters API 取代)
  • 符號 (Symbol)
// 使用 var 自動判定型別
var name = 'Voyager I';
var year = 1977;
var antennaDiameter = 3.7;

// 手動賦予型別
String name2 = '坂倉';
int year2 = 2004;
double pi = 3.14;
bool yes = true; // 在 dart 中布林值為全小寫,跟 Python 不一樣
bool no = false;

這裡有詳細的官方教學: https://dart.dev.org.tw/language/variables

數字

在 Dart 中 int 代表整數,由於 Dart 可以直接在作業系統編譯,也可能被轉譯成 Javascript,因此根據使用場景不同,值的範圍也不可,比如在 Javascript 中,int 會被儲存在沒有小數部分的 64 位元浮點數中,因此此時的值會在 -2⁵³ 到 2⁵³-1 之間。另外,如同 Javascript 中的 Number,我們也可以將數字都以 num 型態表示。num 型態變數可以同時具有 int 和 double 值。

num a = 10;

與 Java 類似,在 Dart 中,由於沒有 unsigned 無符號做修飾,因此在進行右移時 >> 當作有符號右移 (會根據最左邊的位元填補),而 >>> 則視為無符號右移(一律以 0 填補)。

對於除法運算,這點類似 Javascript, Python,在一般的情況下會自動改以浮點數進行運算,因此,若想要使用單純的整數除法時,可以使用 ~/ 來進行。(在 Python 中以 // 來表示整數除法,導致在 Python 中無法用 // 來當作註解,必需改用另一個 syntax #;另外,在 Javascript 中沒有直接語法原生支援整數除法)

int x = 10;
print(x / 3);  // 3.3333333333333335
print(x ~/ 3); // 3

字串

Dart 的字串是 UTF-16 碼單位的序列,與 Javascript 類似,可以使用單引號或雙引號表示字串。另外也有類似 ES6 的特性,可以在字串中直接加入變數或表達式。

int a = 10;
print("int a = $a"); // int a = 10

可以加上花括號,包入三元表達式。(三元表達式晚點會再介紹)

int a = 10;
print("Is a larger than 5 ... ${a > 5 ? "yes" : "no"}");
// is a larger than 5 ... yes

當然,如果只是想要錢字號的話,可以利用反斜線跳脫

int a = 10;
print("\$a $a");

與 Javascript, Java, Python 類似,連接字串時可以利用 + 處理。另外,在 Dart 中,也可以利用相鄰的引號自動連接字串。

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";

// String concatenation works even over line breaks.

與 Python, Go 類似,在 Dart 中可以利用三個引號建立多行字串

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

關鍵字(保留字)

在幾乎所有的程式語言中,變數的名稱都會有限制,在 Dart 也不例外,這些保留字有其特殊用途因此無法作為變數名稱。參考:https://dart.dev.org.tw/language/keywords

https://ithelp.ithome.com.tw/upload/images/20240903/20129540hiTAdY5iLH.png
https://ithelp.ithome.com.tw/upload/images/20240903/20129540i0k4qMZbJH.png

其實滿多的,畢竟 Dart 有支援物件導向!

流程控制

參考官方文件:

if-else

這個部分跟大部分程式語言一樣,在 if 子句中,必需放入布林值(bool)或條件式進行判斷

var n = 15;
if (n % 2 == 1) {
    print("$n is odd");
} else {
    print("$n is even");
}

// 15 is odd

若判斷條件為多個則可以在 else 後再加入 if,這個寫法與 C, Java, Javascript 相同。

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

if-else 也可以利用三元判斷式來簡化,這個語法糖在 C, Java, Javascript, PHP 等語言中都有支援。? 前放入判斷式,?: 之間代表條件為真時會執行的語句,: 之後的語句則在條件不為真時執行。

int num = 5;
String isEven = num & 1 == 1 ? "odd" : "even";
print("$num is $isEven");
// 5 is odd

switch-case

在 Dart 中,switch-case 是會自動 break 的,因此 break 可寫可不寫。

int x = 5;
switch (x) {
case 1:
  print(1);
case 2:
  print(2);
default:
  print("other");
}
// other

在這種會自動 break 的語言中,如果一次要配多多個 case 該怎麼辦呢?比如在 Go 中,我們可以使用 , 來匹配。有點反直覺,在 Dart 中,我們仍然可以使用如同 C, Java, Javascript 的方式匹配,對於那些 case 中無任何程式者,Dart 並不會直接 break,而是會自動跳到下一個語句判斷。

int y = 5;
switch (y) {
    case 1:
    case 2:
    case 3:
    case 4:
      print("1~4");
    // break; (這裡才會 break)
    case 5:
    case 6:
    case 7:
    case 8:
      print("5~8");
    // break; (這裡才會 break)
    default:
      print("other");
}

// 5~8

我們以 javascript 做比較,在 javascript 中必需加入 break

var num = 5;

switch (num) {
case 1:
case 2:
case 3:
case 4:
  console.log("1~4");
  break;
case 5:
case 6:
case 7:
case 8:
  console.log("5~8");
  break;
default:
  console.log("other");
}

// 5~8

在 Go 語言中,與 Dart 類似也會自動 break,但是 Go 語言對於那些 case 內無任何動作者,會直接 break,所以 Go 是使用 , 來配對 case。若在 Go 語言中使用 dart 那種寫法會導致沒有任何字串被印出!

num := 5
switch num {
case 1, 2, 3, 4:
    fmt.Println("1~4")
case 5, 6, 7, 8:
    fmt.Println("5~8")
default:
    fmt.Println("other")
}

// 5~8

for-loop

在 dart 中 for-loop 的用法,與 Javascript, Java 雷同,以下是一個最簡單的範例

for(int i = 0; i < 5; i++){
    print(i);
}
// 0
// 1
// 2
// 3
// 4

另外,Dart 中的 for-loop 也支援 breakcontinue。當迴圈有嵌套時,為了一次跳脫多個迴圈,Dart 也有與 Java, Go 類似的 break [label] 的方式跳脫迴圈。在 for 迴圈前利用冒號 : 去設定標籤。

outloop:
for (var i = 0; i < 10; i++) {
    inloop:
    for (var j = 0; j < 9; j++) {
      if (j == 2) {
        break inloop;
      }
      if (i == 5) {
        break outloop;
      }
      print("i:$i j:$j");
    }
}

// i:0 j:0
// i:0 j:1
// i:1 j:0
// i:1 j:1
// i:2 j:0
// i:2 j:1
// i:3 j:0
// i:3 j:1
// i:4 j:0
// i:4 j:1

while

在 Dart 中除了 while loop 外,也支援常見的 do while

while (!isDone()) {
  doSomething();
}

do {
  printLine();
} while (!atEndOfPage());

後記:為了寫這篇教學我去看了 dart 官網的教學才發現 dart3 多了一些新東西。其實有在思考哪些要寫哪些不寫,因為真的滿多能講的。


上一篇
Day-1 什麼是 Flutter?什麼是 Dart?
下一篇
Day-3 Dart 簡介(2):List, Map 及 Null Safety
系列文
從零開始以Flutter打造跨平台聊天APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言