Dart语法要点汇总

栏目: IOS · 发布时间: 5年前

内容简介:[In][Out]这是一个创建并初始化变量的例子

[In]

// main为Dart程序入口
void main() {
  // 调用printNumber方法
  var number = 58;
  printNumber(number);
}

// 方法返回类型缺省时,默认返回类型为dynamic
printNumber(int number) {
  // 1. 字符串用单/双引号均可
  // 2. 字符串中支持${}表达式, 单字符变量时可简化为$
  print("The number is $number.");
}

[Out]

The number is 58.
  • Dart单行注释用 // ,多行注释用 /**/ (同Java)
  • var 是一种不需要指定类型的声明方式
  • int 是一种数据类型,对应的还有 StringListbool 类型
  • 字符串的标识用单、双引号均可(同 Python 、JS)
  • 字符串中支持 ${number} 表达式, 单字符变量时可简化为 $number (同JS的`${number}`)

当你在学习Dart语言时,你需要清楚这概念:

  • 所有的东西都是一个对象,每个对象都是一个class的实例,即使是数字、函数、 null 都是对象,并且所有的对象都集成自Object类。
  • 尽管Dart语言是一种强类型语言,但你在类型声明时仍然可以不指定类型,因为Dart可以自动进行类型推断。在上面的代码中, number 变量的类型就被推断为 int ,当你并不想显式地声明类型时,你可以使用置顶的类型 dynamic 来标识。
  • Dart语言同样支持泛型,如 List<int>List<dynamic> (同Java)。
  • Dart语言支持顶级方法(即不与类绑定的方法,如上的 main 方法),以及绑定类和实例的方法(分别对应静态方法和实例方法),而且还支持方法嵌套(同Python、JS)。
  • Java 不同的是,Dart语言并不支持 publishprotectedprivate 这些关键字,它是通过前缀 _ 来标识为私有域的(同Python),

变量

这是一个创建并初始化变量的例子

var name = 'Bob';

name 变量类型被推断为 String ,你也能更改为制定的类型。如果一个变量的类型并不限制于单一类型,你也可以使用 dynamicObject 进行声明,如:

dynamic name = 'Bob';

同样也可以选择制定的声明方式

String name = 'Bob';

但根据Dart推荐的编码风格,在局部变量中使用 var 要更优于制定的类型声明。

默认值

Dart中声明时如果未初始化,会被自动初始化为 null

int lineCount;
assert(lineCount == null);

注: assert 只在开发环境有效,在实际的生产环境无效

final与const

finalconst 标识该变量只能被赋值一次,区别在于 final 是运行时赋值, const 是编译时赋值。

final String nickname = 'Jack';
// final修饰时, 可省略类型声明
final name = 'Jack';

const 不仅可以用来声明变量,还能用来创建常量值,如:

// 此时不能在对列表a进行更新操作
var a = const [1, 2];

内置类型

数字型

包含 intdouble ,不包含

float

常用的类型转换

// String -> int
var a = int.parse('1');
assert(a == 1);

// String -> double
var b = double.parse('1.1');
assert(b == 1.1);

// int -> String
String c = 1.toString();
assert(c == '1');

// double -> String
String d = 3.14159.toStringAsFixed(2);
assert(d == '3.14');

字符串

  • 单引号、双引号均可

  • 字符串拼接时,换行可省略加号,如

    var a = '123'
        '456';
    print(a);
    // Out: 123456
    
  • 字符串可以用索引,但不支持负值索引(区分于Python),如

    var a = 'Jack';
    print(a[1]);
    // Out: a
    

列表

在Dart语言中,数组即列表

[In]

void main() {
  // 初始化
  var list = ['a', 'b', 'c'];
  // 增
  list.add('d');
  // 删
  list.remove('b');
  // 改
  list[1] = 'cc';
  // 查
  var last = list[list.length - 1];
  print('list is $list');
  print('last is $last');
}

[Out]

list is [a, cc, d]
last is d

字典

[In]

void main() {
  var map = {'a': 1, 'b': 2};
  // 增
  map['c'] = 3;
  // 删
  map.remove('a');
  // 改
  map['b'] = 22;
  // 查
  var cValue = map['c'];
  print('map is $map');
  print('cValue is $cValue');
}

[Out]

map is {b: 22, c: 3}
cValue is 3

函数

Dart是一门完全面向对象的语言,即使它的函数也是一个对象,并且有自己的类型—— Function 。这就意味着函数可以被赋值为一个变量,或者作为一个参数在其他函数之间传递。

对于只包含一个表达式的方法体,你也可以使用 => 的简写形式,如:

void say() {
    print('123');
}

// 该写法与以上有同样效果
void say2() => print('123');

可选参数

Dart的可选参数分为 命名可选参数位置可选参数 两种(两者之间互斥,即不能同时使用)。

命名可选参数

[In]

void main() {
  say(age: 27);
}

void say({String name='Jack', int age=20}) {
  print('$name\'s age is $age.');
}

[Out]

Jack's age is 27.

位置可选参数

[In]

void main() {
  say('Tom', 27, 'Love game.');
}

void say(String name, int age, [String remark]) {
  print('$name\'s age is $age.${remark??''}');
}

[Out]

Tom's age is 27.Love game.

默认参数值

参数可用 = 声明默认值,默认值只能是编译时常量。

注: 命名可选参数 的默认参数值可使用 : 指定,但对于 位置可选参数 不支持,推荐统一使用 = 的默认参数指定方式

匿名函数

[In]

void main() {
  var list = ['Android', 'iOS', 'WindowPhone'];
  list.forEach((item) {
    print(item);
  });
}

[Out]

Android
iOS
WindowPhone

特殊操作符

  • is <=> Java的 instanceof

  • a?.b <=> a == null ? null : a.b

  • a??b <=> a == null ? b : a

  • a ??= b <=> a = a == null ? b : a

  • a as String <=> Java的 (String) a

  • .. 级别操作符

    var button = querySelector('#confirm');
    button.text = 'Confirm';
    button.classes.add('important');
    button.onClick.listen((e) => window.alert('Confirmed!'));
    
    // 该写法等价上述写法
    querySelector('#confirm') // Get an object.
      ..text = 'Confirm' // Use its members.
      ..classes.add('important')
      ..onClick.listen((e) => window.alert('Confirmed!'));
    

异常

// 抛异常
throw FormatException('Expected at least 1 section');
throw 'Out of llamas!';

// 捕获异常
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  // 第二个参数s是一个错误堆栈实例
  print('Stack trace:\n $s');
}

try {
  dynamic foo = true;
  print(foo++); // Runtime error
} catch (e) {
  print('misbehave() partially handled ${e.runtimeType}.');
  // 关键字rethrow重新抛出异常
  rethrow; // Allow callers to see the exception. 
}

重载操作符

class Vector {
  final int x, y;

  Vector(this.x, this.y);

  Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
  Vector operator -(Vector v) => Vector(x - v.x, y - v.y);

  // Operator == and hashCode not shown. For details, see note below.
  // ···
}

void main() {
  final v = Vector(2, 3);
  final w = Vector(2, 2);

  assert(v + w == Vector(4, 5));
  assert(v - w == Vector(0, 1));
}

生成器

  • sync* + yield 返回 Iterable 对象
  • async* + yield 返回 Stream 对象
Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

如果生成器返回值是可迭代的,亦可使用 yield* 来提高性能,如:

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}

可调用的类

给类定义 call 方法能使得当前类是Callable的(同Python)

class WannabeFunction {
  call(String a, String b, String c) => '$a $b $c!';
}

main() {
  var wf = new WannabeFunction();
  var out = wf("Hi","there,","gang");
  print('$out');
}

以上所述就是小编给大家介绍的《Dart语法要点汇总》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

海量运维、运营规划之道

海量运维、运营规划之道

唐文 / 电子工业出版社 / 2014-1-1 / 59.00

《海量运维、运营规划之道》作者具有腾讯、百度等中国一线互联网公司多年从业经历,书中依托工作实践,以互联网海量产品质量、效率、成本为核心,从规划、速度、监控、告警、安全、管理、流程、预案、考核、设备、带宽等方面,结合大量案例与读者分享了作者对互联网海量运维、运营规划的体会。 《海量运维、运营规划之道》全面介绍大型互联网公司运维工作所涉及的各个方面,是每个互联网运维工程师、架构师、管理人员不可或......一起来看看 《海量运维、运营规划之道》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具