我试图了解开关是如何工作的。我的代码非常简单:
methodname(num radians) {
switch (radians) {
case 0:
// do something
break;
case PI:
// do something else
break;
}
}
遗憾的是,这不起作用。如果保留为此错误是:case表达式必须具有相同的类型(我的类型是num,但不是编辑器)。 如果我将0更改为0.0,则表示:切换类型表达式double不能覆盖==运算符 - 我不知道这意味着什么!
那么切换案例的方法是什么?我可以将它转换为if / else,但我想知道如何使交换机工作,为什么它不能在第一时间工作。
我正在运行最新的DartEditor稳定版本。
请有人帮忙吗?
答案 0 :(得分:6)
使用' =='对双值进行比较不是很可靠,应该避免(不仅在Dart中,而且在大多数语言中)。
您可以执行类似
的操作methodname(num radians) {
// you can adjust this values according to your accuracy requirements
const myPI = 3142;
int r = (radians * 1000).round();
switch (r) {
case 0:
// do something
break;
case myPI:
// do something else
break;
}
}
此问题包含您可能感兴趣的一些其他信息
更多信息:
答案 1 :(得分:5)
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();
}
以下示例省略了 break
子句中的 case
语句,从而产生错误:
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break
case 'CLOSED':
executeClosed();
break;
}
然而,Dart 确实支持空的 case
子句,允许一种形式的失败:
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
子句可以有局部变量,这些变量只在该子句的作用域内可见。
引用自:https://dart.dev/guides/language/language-tour#switch-and-case