你可使用如下任意一個了控制Dart的代碼流程閉包
if
和 else
for
循環while
和do-while
循環break
和continue
switch
和case
assert
你也能夠用 try-catch
和throw
來影響控制流。框架
Dart支持可選else
語句的if
語句,例如:less
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
複製代碼
不像JavaScript, 條件必須用boolean值。工具
你能夠迭代標準的for
循環, 例如:ui
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
複製代碼
Dart的for
循環內部的閉包捕獲了索引的值,避免了JavaScript中常見的陷阱。 例如,考慮一下:this
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());
複製代碼
正如預期的那樣,輸出爲0而後爲1。 相比之下,該示例將在JavaScript中打印2而後打印2。url
若是要迭代的對象是Iterable,則可使用forEach()
方法。 若是你不須要知道當前的迭代計數器,使用forEach()
是一個不錯的選擇:spa
candidates.forEach((candidate) => candidate.interview());
複製代碼
可迭代的類例如 List 和 Set 也支持 for-in
形式的迭代命令行
var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}
複製代碼
while循環在 循環前 計算條件:debug
while (!isDone()) {
doSomething();
}
複製代碼
do-while循環在 循環後 計算條件:
do {
printLine();
} while (!atEndOfPage());
複製代碼
用break
中止循環:
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
複製代碼
用continue
跳到下一次循環迭代:
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
複製代碼
若是你使用Iterable(如list或set),則能夠以不一樣的方式編寫該示例:
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
複製代碼
Dart中的switch語句使用==
比較整數,字符串或編譯時常量。 比較的兩個對象必須都是同一個類的實例(並且不能是其任何子類型),而且該類不能覆寫==
。 枚舉類型在switch
語句中也適用。
每一個非空case子句以break
語句做爲結束規則。 結束非空case子句的其餘有效方法有continue
,throw
或return
語句。
當沒有case子句匹配時,使用default
子句執行代碼:
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
case 'APPROVED':
executeApproved();
break;
case 'DENIED':
executeDenied();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
複製代碼
如下示例省略了case子句中的break
語句,從而發生錯誤:
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break
case 'CLOSED':
executeClosed();
break;
}
複製代碼
可是,Dart確實支持空子句,只容許一種形式的落空(不寫子句):
var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}
複製代碼
若是你真的想要落空,可使用continue
和標籤
:
var command = 'CLOSED';
switch (command) {
case 'CLOSED':
executeClosed();
continue nowClosed;
// Continues executing at the nowClosed label.
nowClosed:
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}
複製代碼
case
子句能夠具備局部變量,這些變量僅在該子句的範圍內可見。
在開發期間,使用assert語句- assert(condition,optionalMessage)
- 來正常中斷執行,若是布爾條件爲false。 你能夠在本系列中找到斷言語句的示例。 這裏還有一些:
// Make sure the variable has a non-null value.
assert(text != null);
// Make sure the value is less than 100.
assert(number < 100);
// Make sure this is an https URL.
assert(urlString.startsWith('https'));
複製代碼
爲了要將消息附加到斷言,請添加一個字符串做爲斷言
的第二個參數。
assert(urlString.startsWith('https'),
'URL ($urlString) should start with "https".');
複製代碼
斷言的第一個參數能夠是解析爲布爾值的任何表達式。 若是表達式的值爲true,則斷言成功並繼續執行。 若是爲false,則斷言失敗並拋出異常(AssertionError)。
斷言什麼時候起做用? 這取決於你使用的工具和框架:
--enable-asserts
。在生產環境的代碼中,將忽略斷言,而且不會計算斷言的參數。