如何在Dart中使用Switch Case语句

93

我正试图理解在Dart中开关的工作原理。我有非常简单的代码:

methodname(num radians) {
  switch (radians) {
    case 0:
      // do something
      break;
    case PI:
      // do something else
      break;
  }
}

很不幸,这种方法不起作用。如果保留原样会出现错误:case表达式必须具有相同的类型(我认为类型是num,但编辑器不是)。 如果我将0更改为0.0,则会显示:switch类型表达式double无法覆盖==运算符 - 我不知道这是什么意思!

那么怎么做才能使用switch语句呢?我可能可以把它转换成if/else,但我想知道如何使switch语句工作以及为什么一开始它不能正常工作。

我正在运行最新稳定版本的DartEditor。


4
Dart语言中的开关语句比其他编程语言更成熟且具有更多的功能。例如,在Dart中,每个case必须使用关键字'break'、'continue'、'rethrow'、'return'或'throw'。请查看https://flutterrdart.com/dart-switch-case-statement-with-examples/教程以了解Dart中的开关语句。 - Waheed Akhtar
4个回答

112

使用“==”比较双精度值并不是非常可靠的,应该避免使用(不仅在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;
  }
}

这个问题包含一些可能会对您感兴趣的附加信息

更多信息:


谢谢你的提示,在这种情况下并不是问题,因为弧度在这种情况下是通过程序生成的,可以是0或PI,正好从写入PI的同一位置获取,希望它应该完全相同,但这并不能回答问题:如何调整类型以允许switch case。我之前遇到了很多switch的问题(首先case应该是const - 我不明白为什么不是在运行时计算的值),现在又出现了这个问题...我只想理解这种行为。谢谢 - Peter StJ
@PeterStJ 使用 if/else,在一些(所有?)编程语言中是常见的行为。参考链接:https://dev59.com/nGjWa4cB1Zd3GeqPqGNu - JAre
@PeterStJ 你也可以使用字符串表示法 + 可以截断它以获得精度。 - JAre
我不知道为什么情况需要是一个常量表达式,但语言规范要求它(请参见我添加的链接)。您可以在intString值或自定义类型上进行切换,除非它们允许与intString值进行比较,否则不要覆盖==switch和所有case表达式必须是相同的类型。 - Günter Zöchbauer
2
@GünterZöchbauer 使用const值可以预测分支,防止一些“黑魔法”,例如每次访问时值可以更改。而且使用“相同类型规则”,您可以获得==运算符的可交换性。 - JAre
显示剩余2条评论

10

以下是Dart中switch case的示例。

问题:编写一个程序以打印给定数字的乘法表。从用户处接受输入并显示其乘法表。

import 'dart:io';

void main(List<String> args) {
  print('enter a number from 1 to 7');

  var input = stdin.readLineSync();

  int day = int.parse(input!);

  switch (day) {
    case 1:
      print('Sunday');
      break;

    case 2:
      print('Monday');
      break;

    case 3:
      print('Tuesday');
      break;

    case 4:
      print('Wednesday');
      break;
    case 5:
      print('Thursday');
      break;

    case 6:
      print('Friday');
      break;
    case 7:
      print('Saturday');
      break;
    default:
      print(' invalid entry');
  }
}

3

我认为Dart 3的switch expression为此提供了更加简洁的语法。

bool methodname(num radians) {
  const myPI = 3142;
  int r = (radians * 1000).round();

  return switch (r) {
    myPI => true,
    _ => false,
  };
}

0
对于仅比较两个值,最好使用三元操作符。
radians == 0
    ? //do something
    : //do something

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接