Dart 变量,类型,异常

2021-04-20  本文已影响0人  逍遥德道

void main() {

  //const与final 都不可更改,const是编译器常量,final是运行时常量

  const cc = 100;

  final ff = 100;

  final fff = cc;

  //错误 编译器流程在前,此时ff未赋值

  // const ccc = ff;

  // var

  //1 var 初始化为String ,不能改为int

  var a = "ss";

  // a = 10;

  //2 var 不进行初始化,

  var b;

  b = "ss";

  b = 100;

  //Object 父类,任意改变

  Object c = "ss";

  c = 100;

  //dynamic 写法与Object 一致,但是编译器不会进行检测,Object类型确定编译器会检测

  dynamic d = "ss";

  d = 100;

  //没有改方法编译器不报错

  // d.foo();

  //int 会根据赋值给不同的内存大小,跟java的4个确定字节不一样

  int e = 1;

  // e.bitLength = 1;

  e = 10;

  // e.bitLength = 4;

  //String使用跟kotlin一致

  String f = "ss";

  f = "ss$f";

  f = """

  aaa

  bbb

  ccc

  """;

  //r 原始类型 raw 下面的效果是一样的

  // f = r"\n" == "\\n";

  //bool

  bool g = true;

  //List 数组

  List<int> h = List();

  h = [1, 2, 3];

  h.forEach((element) {

    print(element);

  });

  for (var value in h) {

    print(value);

  }

  for (var i = 0; i < h.length; i++) {

    print(i);

  }

  //数组与const

  const List<int> j = [1, 2, 3];

  //不行

  // j.add(4);

  // j = [1];

  List<int> jj = const [1, 2, 3];

  //不行,报错 const定位的是内存空间已不能修改

  // jj.add(4);

  // jj[2] = 2;

  jj = [1];

  //map 集合 const 与 list 一样

  Map<int, int> map = {1: 1, 2: 2};

  //修改

  map[1] = 2;

  //添加

  map[3] = 3;

  //null

  print(map[4]);

  map.forEach((key, value) {});

  map.keys.forEach((element) {});

  map.values.forEach((element) {});

  //Runes 特殊字符标识类 Unicode32

  var clapping = '\u{8F8F1}';

  ///5个16进制 需要使用{}

  print(clapping); //👏

//获得 16位代码单元

  print(clapping.codeUnits); //[55357, 56399]

//获得unicode代码

  print(clapping.runes.toList()); //[128079]

//fromCharCode 根据字符码创建字符串

  print(String.fromCharCode(128079));

  print(String.fromCharCodes(clapping.runes));

  print(String.fromCharCodes([55357, 56399]));

  print(String.fromCharCode(0x1f44f));

  Runes input = new Runes(

      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');

  print(String.fromCharCodes(input));

  /**

  * Symbols 标识符

  */

  var aa = #sadsad;

  switch (aa) {

    case #A:

      break;

    case #sadsad:

      break;

  }

  //操作符 as 强转

  num q = 10;

  int w = q as int;

  // is 判断是什么类型 is!

  bool ee = q is! int;

  //赋值 += /= 等

  // ??=

  // k==null 的时候赋值

  var k;

  k ??= "11";

  //三目表达式可以使用 if(true)?true:false

  //条件表达式 k ==null v = 789 否则 v=k

  var v = k ?? "789";

  /**

  * 级联操作符 双点 ..

  */

  Build()

    ..a()

    ..b();

  Build().c().d();

  /**

  * ?. 安全操作符 跟kotlin一样

  */

  String str;

  str?.length;

  //方法 一等对象方法

  //所有的方法都是对象,可以赋值给Function变量 Function不能知道方法的参数,类型,返回等

  Function function = fun;

  //参数不匹配

  //function((int i,int j){});

  //参数为匿名方法,闭包等名字

  fun2((i, j) {});

}

void fun(Function f) {

  f();

}

//定义F类型

typedef void F(int i, int j);

//写起来很麻烦

void fun1(F f) {

  f(1, 1);

}

void fun2(void f(int i, int j)) {

  f(1, 1);

}

class Build {

  void a() {}

  void b() {}

  Build c() {

    return this;

  }

  Build d() {

    return this;

  }

}

//回调类不用写了,直接使用方法为参数

typedef void onClick();

class Button {

  void setOnClickListener(onClick listener) {

    listener();

  }

}

//可选位置参数

void main2() {

  fun3();

  fun3(1);

  fun3(1, 2);

  fun4();

  fun4(i: 1, j: 2);

  fun4(j: 2, i: 4);

}

//[] 可选位置参数 ,可以设置默认值,要按顺序传值

void fun3([int i = 1, int j = 2]) {}

//{} 可选命名参数,可以设置默认值,可以按名字传值

void fun4({int i = 1, int j = 2}) {}

//异常

void main3() {

  try {

    test();

  } catch (e,s) {

    //可以只有一个 e

    //e,就是抛出的异常对象

    print(e.runtimeType);

    //s,是stacktrace 调用栈信息

    print(s.runtimeType);

  }

  //捕获指定异常 on

  try{

    test();

  }on Exception catch(e){

  }on String catch(e){

  }finally{

  }

}

void test() {

  // throw Exception("exception");

  throw "exception";

}

上一篇下一篇

猜你喜欢

热点阅读