Android学Dart学习笔记第十一节 分支

序言

文档上叫Branches,实际上呢就是条件判断,包含了 if else,switch, when之前我们也基本都有涉猎,

这篇文章再过一下

if

dart 复制代码
if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

非常熟悉,毫无差别。

if case

dart 复制代码
if (pair case [int x, int y]) return Point(x, y);

含义是pair是一个int类型的list,有且只有2个值。

一种新的写法,和我们之前学到的模式共用,不管怎么样最终括号内的都是bool,也不难理解

Switch statements

不需要break

dart 复制代码
 var i  = 1;
  switch (i) {
    case 1:
      print('i is 1');
    case <2:
      print('i is 2');
    default:
      print('i is not a number');
  }

看一下这个例子,你觉得最后会输出什么?

最后只输出了

dart 复制代码
      print('i is 1');

看看文档的描述:

When the value matches a case's pattern, the case body executes. Non-empty case clauses jump to the end of the switch after completion. They do not require a break statement. Other valid ways to end a non-empty case clause are a continue, throw, or return statement.

译文:当值匹配一个分支的模式时,执行分支体。非空case子句在执行完成后跳到切换的末尾。它们不需要break语句。其他结束非空case子句的有效方法是continue、throw或return语句。

通俗的讲,只要case子句不是空的,执行完成之后就不会再执行其他case子句。如果你想主动结束,可以使用continue、throw或return语句

空cace子句会和下一个非空子句共用一个子句。

default 等同于case _

default和 case _都是没有匹配的case,就会执行的默认操作。

dart 复制代码
 var i  = 3;
  switch (i) {
    case 1:
      print('i is 1');
    case <2:
      print('i is 2');
    // default:
    case _:
      print('i is not a case');
  }

label在switch中的用法

我们之前已经学习了label在switch中的用法,下面继续深入

在上面的例子中,在case 1的子句末尾,我们手动书写了
continue oneNext; 在case _子句的上方,我们给这个子句起了一个label,名叫oneNext

所以当i ==1时,执行完case 1的子句之后,无视条件判断直接执行了case _子句的内容。

switch表达式

switch可以用在下面的位置

dart 复制代码
var x = switch (y) { ... };

print(switch (x) { ... });

return switch (x) { ... };

正常的switch案例:

dart 复制代码
// Where slash, star, comma, semicolon, etc., are constant variables...
switch (charCode) {
  case slash || star || plus || minus: // Logical-or pattern
    token = operator(charCode);
  case comma || semicolon: // Logical-or pattern
    token = punctuation(charCode);
  case >= digit0 && <= digit9: // Relational and logical-and patterns
    token = number();
  default:
    throw FormatException('Invalid');
}

switch表达式简化后:

dart 复制代码
token = switch (charCode) {
  slash || star || plus || minus => operator(charCode),
  comma || semicolon => punctuation(charCode),
  >= digit0 && <= digit9 => number(),
  _ => throw FormatException('Invalid'),
};

语法需要多多练习下。

Exhaustiveness checking

穷举检查

dart 复制代码
  bool open = false;
  switch (open) {
    case true:
      print('open');
  }

当值的范围是有限且明确,如bool,enmu等,如果未对switch语句提供对应的case且没有提供defalut子句,编译时将会报错。

Guard clause

To set an optional guard clause after a case clause, use the keyword when. A guard clause can follow if case, and both switch statements and expressions.

译文:要在case子句后面设置可选的保护子句,请使用关键字when。guard子句可以跟在if分支、switch语句和表达式之后。

dart 复制代码
// Switch statement:
switch (something) {
  case somePattern when some || boolean || expression:
    //             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
    body;
}

// Switch expression:
var value = switch (something) {
  somePattern when some || boolean || expression => body,
  //               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
}

// If-case statement:
if (something case somePattern when some || boolean || expression) {
  //                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Guard clause.
  body;
}
相关推荐
视觉小萌新8 分钟前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
撩得Android一次心动1 小时前
Android中Gradle网络下载超时、更改存放位置(解决方案)
android·gradle
HQL_seven3 小时前
【Activity】Android Activity详解
android
AI2中文网3 小时前
安卓 15/16 手机软键盘遮挡输入框、布局顶不上去?已解决:重新编译即可
android·智能手机
字节暗面3 小时前
Android APP 加固横评记录:爱加密、梆梆、网易易盾与腾讯 ACE
android·逆向工程·加固
yyyang883 小时前
蓝牙系统整体架构详解
学习·信息与通信
程序边界3 小时前
一台数据集成软件的拆解笔记(下):一致性、容错、跑批与迁移,KFS 真正难的地方在这
java·前端·笔记
落魄Android在线炒饭3 小时前
Android 实战问题反推 OpenGL 概念(上)
android·opengl
Linux-lucky3 小时前
46-Linux学习之旅之LVS负载均衡与keepalived高可用
linux·运维·学习·ubuntu·负载均衡·lvs
booboosui3 小时前
DeepSeek 的 Worker 调得动 GitHub,调不动微信:三类 Worker 的实现差别
android