[Flutter]足够入门的Dart语言系列之流程控制语句:条件和循环(if、switch、for、while)

简介: 流程控制相关的语句主要分为:条件语句、循环语句、循环中的中断语句、以及异常处理语句。流程控制用于根据需要组合不同的语句、执行不同的处理,完成正确的流程逻辑。由此可以更好、更正确的完成程序功能...
Control flow statements 控制流程语句

流程控制相关的语句主要分为以下几类:

  • 条件流程

    • if...else
    • switch...case
  • 循环流程

    • for循环
    • while循环
    • do...while循环
  • 中断流程

    • continue
    • break
    • return
  • 异常流程(异常捕获/异常处理)

    • try...catch

流程控制用于根据需要组合不同的语句、执行不同的处理,完成正确的流程逻辑。

条件流程

根据条件的满足情况,来执行不同的逻辑代码块。Dart支持ifswitch条件语句。

if语句

if用于当满足条件(结果为true)执行对应的代码块;if...else中当if条件不满足时,执行else的代码块。

bool condition = Random().nextBool();

// 单分支
if(condition){
  // condition = true 时执行逻辑
}

// 二分支
if(condition){
  // condition = true 时执行逻辑
}else{
  // condition = false 时执行逻辑
}

如果需要多个分支,可以使用else if 继续添加条件。

如下所示,将 [0,100] 的分数通过if...else if...else转化为 A~E 五个等级:

// E: [0,60)
// D: [60,70)
// C: [70,80)
// B: [80,90)
// A: [90,100]
String getLevel(double grade) {
  String level = '';
  if (grade >= 0 && grade < 60) {
    level = 'E';
  } else if (grade < 70) {
    level = 'D';
  } else if (grade < 80) {
    level = 'C';
  } else if (grade < 90) {
    level = 'B';
  } else {
    level = 'A';
  }
  return level;
}

switch 语句

if条件判断的是真假(bool),来执行对应的分支。switch针对一般对象进行比较,相等时执行对应分支。通过对比switch(value)条件中的值与case value_for_match:的值,可以方便的实现多分支结构。

switch语句的语法和条件说明:

switch (status){
    case status_1:
        // status == status_1 时执行逻辑
        break;
    case status_2:
        // status == status_2 时执行逻辑
        break;  
    default:
        // 其余情况执行逻辑
}

switch 后面 () 中的case对应的匹配值进行比较,如果满足则执行case对应的分支。

分支内使用break;结束switch的执行,否则将会继续匹配后面的case条件;分支内也可以使用return返回,不执行后续的操作(通常为函数返回)。

如下,通过信号灯的状态枚举TrafficLightStatus,使用switch判断枚举值,返回不同的状态描述:

import 'dart:math';

main(){
  String status =  getLightStatus(TrafficLightStatus.values[Random().nextInt(4)]);
  
  print(status); // 输出随机的灯状态的描述
}

enum TrafficLightStatus{
  red,
  yellow,
  blue,
  none
}

String getLightStatus(TrafficLightStatus status){
  String result = "";
  switch (status){
    case TrafficLightStatus.red:
      result = "红灯,禁止通行";
      break;
    case TrafficLightStatus.yellow:
      result = "黄灯,请您稍后";
      break;
    case TrafficLightStatus.blue:
      result = "绿灯,应许通行";
      break;
    case TrafficLightStatus.none:
      result = "信号灯故障,请联系维修人员";
      break;
  }
  return result;
}
关于函数/方法的定义使用,可以后面再了解。此处主要了解,根据 switch (status)status的不同值,判断并执行不同的 case条件语句。

运行查看。

PS > dart run .\FlowControl.dart
信号灯故障,请联系维修人员
PS > dart run .\FlowControl.dart
绿灯,应许通行
PS > dart run .\FlowControl.dart
绿灯,应许通行
PS > dart run .\FlowControl.dart
黄灯,请您稍后
PS > dart run .\FlowControl.dart
红灯,禁止通行
case分支结构的校验对象原则上可以是任何类型的对象,但 必须是常量。比如一个自定义的 class,需要通过 const修饰符指定为常量,才能放在 case关键字后面。

此外,自定义类型也不能重写 == 操作符

循环流程

循环语句可以做到「能够根据条件不断执行循环体」,这是复杂的算法和数据结构得以实现的基础。Dart中主要提供了forwhile循环。

从大的方面来说,由于程序执行完毕就会终止,所以无论任何软件,其在运行中必定有个循环来让应用不会关闭。而小的方面,一切的遍历操作都离不开循环流程。

循环最基础的作用就是,重复执行某个操作或某段代码;其次就是遍历数据内的所有元素,并进行相关处理。

标准for循环

for loop

标准for循环的结构如下:

for ( startExp ; condition ; eachLoopExp ) {
  loopBody
}

for 关键字后的括号中有三个部分,通过 ; 隔开。其中 startExp 是进入循环体前执行的表达式,只会执行一次; conditionbool 型的变量或结果,是循环的条件,只有为 true 时,才允许执行循环体;eachLoopExp 是在每次循环体结束之后触发的表达式,一般用于修改 condition 的条件。

如下,标准 for 循环在一个StringBuffer的末尾重复写入5个!

var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}

print(message);  // Dart is fun!!!!!

如下,标准 for 循环实现遍历并输出列表中的元素:

List<String> cnBigNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
for (int i = 0; i < cnBigNumUnits.length; i++) {
  print(cnBigNumUnits[i]);
}

对于循环中的eachLoopExp来说,主要用于在本次循环结束后修改循环的条件;真正决定是否继续执行循环体的判断是中间的condition结果。

标准for循环还可以修改为下面的形式:

List<String> cnBigNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
int i = 0;
bool condition = i < cnBigNumUnits.length;
for (; condition; ) {
  print(cnBigNumUnits[i]);
  i++;
  condition = i < cnBigNumUnits.length;
}

// 或者
i = 0;
for (; i < cnBigNumUnits.length; ) {
  print(cnBigNumUnits[i]);
  i++;
}

for...in 循环

for...in循环可以直接遍历访问列表的元素,直接获取元素,而不涉及索引。它是对列表遍历的一个语法糖。在无需索引,只是遍历元素时非常便捷。

List<String> cnBigNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
for (String element in cnBigNumUnits) {
  print(element);
}

forEach遍历

forEach遍历是一个类方法,与for...in一样,直接访问元素。其本质也是使用for...in处理的封装或语法糖。

void forEach(void action(E element)) {
    for (E element in this) action(element);
}

比如forEach遍历输出元素。

List<String> cnBigNumUnits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];

cnBigNumUnits.forEach((e)=>print(e));

再感受一下forEach的简洁

cnBigNumUnits.forEach(print);

while 循环

while 循环比较简单,只要满足条件就执行循环体,执行完后再次判断循环条件是否满足,满足则再次执行循环,不满足则退出循环。

while (condition) {
  loopBody
}

while 相对容易产生死循环,如果condition不变的情况下,就是永远循环下去(直到系统资源耗尽,或者永不结束)。

因此,必须在 conditionloopBody 中动态修改循环条件。

使用while循环输出列表元素:

int i = 0;
while (i < cnBigNumUnits.length){
  print(cnBigNumUnits[i]);
  i++;
}

while 循环是 for 循环的一种简写

while循环相比for循环,并不涉及执行的次数(或者列表的索引)。它可以通过使用迭代器完成遍历:

Iterator<String> it = cnBigNumUnits.iterator;
while(it.moveNext()){
  print(it.current);
}

同样的,转化为for循环,也可以实现迭代器的遍历:

Iterator<String> it = cnBigNumUnits.iterator;
for(;it.moveNext();){
  print(it.current);
}

do...while 循环

do...while 的循环结构如下:

do {
    loopBody
} while(condition)

也就是先执行一次循环体,然后根据条件判断再循环执行。与 forwhile 循环没有本质区别,了解下即可。

参考

相关文章
|
26天前
|
开发框架 Dart 前端开发
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。本文从 Flutter 简介、特点、开发环境搭建、应用架构、组件详解、路由管理、状态管理、与原生代码交互、性能优化、应用发布与部署及未来趋势等方面,全面解析 Flutter 技术,助你掌握这一前沿开发工具。
56 8
|
3月前
|
Dart
如何在 Flutter 项目中使用 Dart 语言?
如何在 Flutter 项目中使用 Dart 语言?
137 58
|
1月前
|
Dart
flutter dart mixin 姿势
flutter dart mixin 姿势
|
2月前
|
Dart 开发者 Windows
flutter:dart的学习
本文介绍了Dart语言的下载方法及基本使用,包括在Windows系统上和VSCode中的安装步骤,并展示了如何运行Dart代码。此外,还详细说明了Dart的基础语法、构造函数、泛型以及库的使用方法。文中通过示例代码解释了闭包、运算符等概念,并介绍了Dart的新特性如非空断言操作符和延迟初始化变量。最后,提供了添加第三方库依赖的方法。
34 12
|
2月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
91 7
|
开发工具 Android开发 iOS开发
Flutter从入门到实战
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/80474494 Flutter从入门到实战 Flutter概述   Flutter是一款移动应用程序SDK,一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。
2261 0
|
2月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
26天前
|
存储 JavaScript 前端开发
在Flutter开发中,状态管理至关重要。随着应用复杂度的提升,有效管理状态成为挑战
在Flutter开发中,状态管理至关重要。随着应用复杂度的提升,有效管理状态成为挑战。本文介绍了几种常用的状态管理框架,如Provider和Redux,分析了它们的基本原理、优缺点及适用场景,并提供了选择框架的建议和使用实例,旨在帮助开发者提高开发效率和应用性能。
34 4
|
26天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
39 2
|
2月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
103 3