Dart 判定运算符,条件表达式

类型判定运算符

as, is, 和 is! 运算符用于在运行时处理类型检查:

Operator Meaning
as Typecast (也被用于指定库前缀)
is True if the object has the specified type
is! False if the object has the specified type

例如, obj is Object 总是 true。 但是只有 obj 实现了 T 的接口时, obj is T 才是 true。

使用 as 运算符将对象强制转换为特定类型。 通常,可以认为是 is 类型判定后,被判定对象调用函数的一种缩写形式。 请考虑以下代码:

if (emp is Person) {
  // Type check
  emp.firstName = 'Bob';
}

使用 as 运算符进行缩写:

(emp as Person).firstName = 'Bob';

条件表达式

Dart有两个运算符,有时可以替换 if-else 表达式, 让表达式更简洁:

condition ? expr1 : expr2

如果条件为 true, 执行 expr1 (并返回它的值): 否则, 执行并返回 expr2 的值。

expr1 ?? expr2

如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。

如果赋值是根据布尔值, 考虑使用 ?:

扫描二维码关注公众号,回复: 10464788 查看本文章
var visibility = isPublic ? 'public' : 'private';

如果赋值是基于判定是否为 null, 考虑使用 ??

String playerName(String name) => name ?? 'Guest';

下面给出了其他两种实现方式, 但并不简洁:

// Slightly longer version uses ?: operator.
String playerName(String name) => name != null ? name : 'Guest';

// Very long version uses if-else statement.
String playerName(String name) {
  if (name != null) {
    return name;
  } else {
    return 'Guest';
  }
}

级联运算符 (..)

级联运算符 (..) 可以实现对同一个对像进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性。 这通常可以节省创建临时变量的步骤, 同时编写出更流畅的代码。

考虑一下代码:

querySelector('#confirm') // 获取对象。
  ..text = 'Confirm' // 调用成员变量。
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

第一句调用函数 querySelector() , 返回获取到的对象。 获取的对象依次执行级联运算符后面的代码, 代码执行后的返回值会被忽略。

上面的代码等价于:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

级联运算符可以嵌套,例如:

final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = '[email protected]'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

在返回对象的函数中谨慎使用级联操作符。 例如,下面的代码是错误的:

var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // Error: 'void' 没哟定义 'write' 函数。

sb.write() 函数调用返回 void, 不能在 void 对象上创建级联操作。

提示: 严格的来讲, “两个点” 的级联语法不是一个运算符。 它只是一个 Dart 的特殊语法。

 

发布了637 篇原创文章 · 获赞 650 · 访问量 58万+

猜你喜欢

转载自blog.csdn.net/qq_38998213/article/details/105171618