ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Flutter/Dart第12天:Dart控制流详解
[打印本页]
作者:
花瓣小跑
时间:
2023-10-31 18:52
标题:
Flutter/Dart第12天:Dart控制流详解
Dart控制流主要由
循环
和
分支
组成:
Dart官方文档-循环:
https://dart.dev/language/loops
Dart官方文档-分支:
https://dart.dev/language/branches
重要说明:
本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。
循环
Dart可通过循环来控制逻辑流,它支持3种语句:for循环,while和do while循环,break和continue等
同时,也可以通过非循环来控制逻辑流,包括:分支(如:if和switch)和异常(try、catch和throw)等
for循环
for循环
可以使用在迭代中,标准用法如下代码样例:
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
复制代码
for-in
循环常用于无需关注迭代的索引,如下代码样例,包含了闭包列表和迭代:
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
for (final c in callbacks) {
c();
}
// 解构:01
复制代码
同样的,
for-in循环
还可以使用对象
模式
(Pattern模式详解:
https://ntopic.cn/p/2023100501
),解构迭代的元素:
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name has $yearsExperience of experience.');
}
复制代码
对于迭代类型(Dart可迭代集合详解:
https://ntopic.cn/p/2023092701
),forEach()方法也可以实现循环:
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3
复制代码
while和do while循环
while循环
和
do while循环
最大的区别:while
先检测
循环条件,
然后执行
循环逻辑;do while
默认先执行1次
循环逻辑,
然后检测
循环条件,以
决定后续
是否继续执行循环逻辑。
while (!isDone()) {
doSomething();
}
do {
printLine();
} while (!atEndOfPage());
复制代码
break和continue循环控制
break
和
continue
在循环中的最大区别:break
中断整个
循环,而continue中断当前循环的
后续逻辑
。
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
// 若`candidates`是可迭代列表,则上面的逻辑可改写如下:
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
复制代码
分支
Dart也可通过分支来控制逻辑流:if语句和元素,if-case语句和元素,switch语句和switch表达式等。
同样的,我们也可以通过其他方式来控制逻辑流:如循环(就是本文的第1节)和异常(try、catch和throw)等
if/else分支
if语句可以有else可选项子句,if后面的括号中的表达式计算值必须是boolean类型,如下代码样例:
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
复制代码
if-case模式
Dart中if语句后的case子句可以带一个
模式
(Pattern模式详解:
https://ntopic.cn/p/2023100501
):
if (pair case [int x, int y]) return Point(x, y);
复制代码
上诉代码样例中,列表模式[int x, int y]首先匹配pair值,并且把列表第1和第2个int类型的元素解构并赋值给了x和y变量。
如果模式未能成功匹配,则需要进入else分支:
if (pair case [int x, int y]) {
print('Was coordinate array $x,$y');
} else {
throw FormatException('Invalid coordinates.');
}
复制代码
switch语句和switch表达式
switch语句后面可以有多个case子句,每一个case子句都可以是一个
模式
(Pattern模式详解:
https://ntopic.cn/p/2023100501
)。
当没有case子句匹配时,就会执行default子句或者_通配符子句:
switch (command) {
case 'OPEN':
executeOpen();
continue newCase; // 继续执行
case 'DENIED':
case 'CLOSED':
executeClosed(); // `DENIED`和`CLOSED`均会执行
newCase:
case 'PENDING':
executeNowClosed(); // `OPEN`和`PENDING`均会执行
}
复制代码
在switch语句中,还可以使用模式,有如下几种用法:
var x = switch (y) { ... };
print(switch (x) { ... });
return switch (x) { ... };
复制代码
switch表达式
可以重写
switch语句
,如下为
switch语句
的代码样例:
// `slash`, `star`, `comma`, `semicolon`等,需要是常量
switch (charCode) {
case slash || star || plus || minus: // `逻辑或`模式
token = operator(charCode);
case comma || semicolon: // `逻辑或`模式
token = punctuation(charCode);
case >= digit0 && <= digit9: // `关系`和`逻辑与`模式
token = number();
default:
throw FormatException('Invalid');
}
复制代码
switch表达式
不同于
switch语句
的语法,包括以下几个方面:
Case可选项无需使用case开头。
Case可选项的逻辑是一个
表达式
,而不是一系列的语句。
Case可选项都必须有
逻辑
,空可选性不代表隐性失败。
Case可选项模式,逻辑使用=>分割。
多个Case可选项之间,使用,分割。
默认可选项,只能使用_。
Switch还可以使用在
穷举检测
中,就是所有的值都有对应的可选项被处理,以避免引发编译错误。默认可选项(default或_)涵盖了所有其他情况,因此它可以保障穷举性。
case-when子句
case-when子句:
在case子句后面增加when子句。
case-when子句
可以用在
if-case
、
switch语句
和
switch表达式
中。
token = switch (charCode) {
slash || star || plus || minus => operator(charCode),
comma || semicolon => punctuation(charCode),
>= digit0 && <= digit9 => number(),
_ => throw FormatException('Invalid')
};
复制代码
case-when子句
计算任何一个boolean类型的值,值为true代表可以执行本Case可选项逻辑,为false则
继续执行
下一个Case可选项,并不会退出整个Switch语句。
我的本博客原地址:
https://ntopic.cn/p/2023101301
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4