iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 4
2
Mobile Development

Flutter---Google推出的跨平台框架,Android、iOS一起搞定系列 第 4

【Flutter基礎概念與實作】 Day4–Dart Language(2)

昨天介紹了Dart的型態以及定義function的方法,今天來看看流程控制以及例外處理吧。

Dart的流程控制跟其他語言沒有差異,該有的都有,if-else、while、for、switch...今天的內容對於有程式基礎的朋友應該非常簡單。

文內的程式碼一樣都能使用DartPad來執行呦。


If-else

if-else會根據條件判斷決定不同的行為,以中文舉例就是「假如今天下雨我就會開車上班,不然我就會騎機車」。
寫成程式碼形式會變成:

if (今天下雨){
    開車();
}
else{
    騎機車();
}

判斷條件也可以超過兩個以上,這時就需要使用else if

void main() {
  var a  = 5;
  if (a > 10) {
    print("a大於10");
  }
  else if (a <= 10 && a >= 0) {
    print("a介於0到10之間");
  }
  else {
    print("a小於0");
  }
}

if-else判斷式還有一個簡潔的寫法叫做三元運算子(Ternary),三元運算子在Flutter也經常會使用到喔。
三元運算子的語法為X = Condition ? A : B;
翻譯成中文就是,若Condition為true,X = A
        若Condition為false,X = B
註:A和B也可以代入function來使用
來看個例子:

void main() {
  var age = 16;
  String verify = age >= 20 ? "滿20歲擁有投票權" : "未滿20歲不能投票";
  print(verify); // Output:未滿20歲不能投票
}

for迴圈

for loop的語法有兩種
第一種:
迴圈會以這樣的流程進行

  1. 從起始值開始
  2. 檢查值是否符合條件式
  3. 若符合->do something... -> 更新值 -> 回到第二步
    若不符合 -> 跳出迴圈
/*
for (起始值; 條件式; 更新值) {
    do something...
}
*/

void main() {
  for (var i = 0; i < 10; i++) {
    print("Current value is $i.");
  }
  // 變數i起始為0,每經過一次迴圈會+1,當i>=10時就會跳出迴圈
}

第二種:
簡單的理解就是依次取出list內的值

/*
for (變數 : 陣列){
    do something...
}
*/
void main() {
    var l = [1, 2, 3, 4, 5];
    for (var num in l) {
        print("Current value is $num");
    }
}

while迴圈

while的語法為:

while(判斷式){
    do something...
}

當while迴圈的判斷式為「true」時會重複執行迴圈內程式碼,直到判斷式變為「false」或是使用break跳離迴圈才會停止。

void main() {
  var a = 5;
  while(a > 0) {
    print(a);
    a--; // 等同於 a = a - 1(將a-1的意思)
  }
  print("while迴圈結束");
  //Output:5 4 3 2 1
  //Output:while迴圈結束
}

上述程式碼在a > 0時都會執行print(a)並把a -1,直到a變成0跳出迴圈。


Do-while迴圈

do-while和while非常像,唯一的差別是do-while「至少」會執行一次,而while有可能不會執行到程式。
語法為:

do { 
    do something...
}while(判斷式);

執行流程為:

  1. 執行一次迴圈內程式碼
  2. 根據判斷式決定是否繼續執行
  3. 若符合 -> 執行迴圈內程式碼 -> 回到第二步
    若不符合 -> 跳出迴圈
void main() {
    var i = 5;
    do{
        print(i);
        i--;
    }while(i > 0);
    // Output:5 4 3 2 1
}

Switch

Switch能夠依照不同的狀態進行不同的處理,有點類似於if但更為直觀並擁有更好的效能。
Switch的語法為:

Switch(變數) {
    case 1:
        do something...
        break;
    case 2:
        do something...
        break;
        .
        .
}
會依照變數屬於哪個case就做哪一種處理
break非常重要一定要記得加喔,不然會報錯。
void main() {
  var fruit = 'apple';
 
  switch(fruit) {
    case 'banana':
      print('You have a banana');
      break;
    case 'cherry':
      print('You have a cherry');
      break;
    case 'durian':
      print('You have a durian');
      break;
    case 'apple':
      print('You have an apple');
      break;

    default: //若沒有符合的case就會執行default
      print("Wow, I don't know what fruit it is.");
  }
}

例外處理

例外處理對於寫程式是很重要的習慣,除了方便你在開發時debug外,對於使用者體驗影響也很大,絕對不會有使用者想用到一個隨時會crash的App,因此我們在使用不穩定的操作(網路連線)或是運算(除法)時一定要記得做例外處理。
例外處理的語法為:

try {
    do something...
} on 特定的Exceptions/Errors{
    //遇到特定例外時執行的部分
}catch(e){ 
    // 當你不確定可能引發的錯誤種類時可以使用catch
    // 它會接收所有的錯誤訊息
}finally{
    // 無論是否有遇到錯誤都會執行到的部分
}

舉一個常見的例子:

void main(){
    int a = 10;
    int b = 0;
    var result = null;
    try{
        result = divide(a, b);
    }on IntegerDivisionByZeroException{
        print("除數不能為0");
    }catch(e){
        print(e);
    }finally{
        print(result);
    }
}
double divide(int a, int b) {
    if(b == 0) {
        //引發Exception
        throw new IntegerDivisionByZeroException(); 
    }
    return a / b;
}

可以從結果得知由於執行divide引發了Exception,而觸發執行on IntegerDivisionByZeroException內程式碼最後執行finally內程式碼。
你也可以嘗試把on IntegerDivisionByZeroException{...}這部分刪掉看看效果如何
提供官方文件列出的Exception和Error網址供參考,基本上各種情況都有相對應的可以選擇,當然也可以根據情況客製化自己的Exception。

今日總結

今天介紹了流程控制以及例外處理,大家一定要熟悉如何使用它們,它們對於程式的執行可是有舉足輕重的地位,一個不小心出錯程式可能就出bug或是崩潰囉。
明天是介紹Dart的最後一天,會以介紹「class」和「async」的概念為主,大家明天見。


上一篇
【Flutter基礎概念與實作】 Day3–Dart Language(1)
下一篇
【Flutter基礎概念與實作】 Day5–Dart Language(3)
系列文
Flutter---Google推出的跨平台框架,Android、iOS一起搞定30

尚未有邦友留言

立即登入留言