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表达式重写如下:
token = switch (charCode) {
slash || star || plus || minus => operator(charCode),
comma || semicolon => punctuation(charCode),
>= digit0 && <= digit9 => number(),
_ => 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表达式中。
switch (pair) {
case (int a, int b) when a > b:
print('First element greater');
case (int a, int b):
print('First element not greater');
}
case-when子句核算任何一个boolean
类型的值,值为true
代表能够履行本Case可选项逻辑,为false
则持续履行下一个Case可选项,并不会退出整个Switch句子。
我的本博客原地址:https://ntopic.cn/p/2023101301