美文网首页
Dart之旅02:变量、类型

Dart之旅02:变量、类型

作者: suikaJY | 来源:发表于2019-02-11 18:38 被阅读0次

    变量声明

    这是一个声明变量的例子:

    var name = 'Bob';
    

    这里其实类似kotlin的类型推断,最后编译出来的name是String类型的对象。值为Bob。

    如果想像Object那样存储任意类型,那么可以直接使用Object或者dynamic关键字。

    当然也可以明确指定变量类型:

    String name = 'Bob';
    

    变量默认值

    在dart中所有变量的默认值都是null,即使是数字变量。所以数字变量也是需要判空的。

    int lineCount;
    assert(lineCount == null);
    

    final和const

    类似于kotlin,const指定的是一个字面量(编译时常量),而final则是初始化时又一次赋值(运行时常量),之后就再也不能变化的常量。

    注意:final类型的变量在初始化时必须进行赋值,这点和java很像,可以在构造函数中赋值。

    一个变量被final修饰的话可以省去var关键字:

    final name = 'Bob';
    final String nickname = 'Bobby';
    

    const通常用来修饰顶层字面量,如果要是在类中则要使用static const,通常可以声明一个数字,字符串,或者一个表达式:

    const bar = 1000000; // Unit of pressure (dynes/cm2)
    const double atm = 1.01325 * bar; // Standard atmosphere
    const T = true;
    
    const num = T?41:43;
    

    const关键字不仅仅可以用来指定常量,也可以给变量声明为一个常量值比如:

    var foo = const [];
    final bar = const [];
    const baz = []; // Equivalent to `const []`
    

    这里的const关键字可以省略,就想baz一样。const修饰的东西内容不可以改变,但foo那种则本身是一个变量,可以更改值。

    内置类型(Built-in types)

    内置类型有以下几个:

    • numbers
    • strings
    • booleans
    • lists(also known as arrays)
    • maps
    • runes(用于在字符串中表达Unicode字符)
    • symbols

    它们都是一些对象,有一些有自己的构造方法例如:Map()

    int

    Integer values no larger than 64 bits, depending on the platform. On the Dart VM, values can be from -2^63 to 2^63 - 1. Dart that’s compiled to JavaScript uses JavaScript numbers, allowing values from -2^53 to 2^53 - 1.

    double

    double遵循IEEE 754标准,也是64位的。

    int和double都是num类型的子类。num类型重载了加减乘除运算符,也包含绝对值abs(),向上向下取整的运算ceilfloor
    移位运算符则在int中重载。更多的数字运算则在dart:math库中存在。

    字符串和数字之间的转换
    // String -> int
    var one = int.parse('1');
    assert(one == 1);
    
    // String -> double
    var onePointOne = double.parse('1.1');
    assert(onePointOne == 1.1);
    
    // int -> String
    String oneAsString = 1.toString();
    assert(oneAsString == '1');
    
    // double -> String
    String piAsString = 3.14159.toStringAsFixed(2);
    assert(piAsString == '3.14');
    
    位运算

    这个其实不太常用姑且记下:
    The int type specifies the traditional bitwise shift (<<, >>), AND (&), and OR (|) operators. For example:

    assert((3 << 1) == 6); // 0011 << 1 == 0110
    assert((3 >> 1) == 1); // 0011 >> 1 == 0001
    assert((3 | 4) == 7); // 0011 | 0100 == 0111
    
    字符串

    dart的字符串是UTF-16的代码单元。你可以使用单引号或者双引号都可以。

    var s1 = 'Single quotes work well for string literals.';
    var s2 = "Double quotes work just as well.";
    var s3 = 'It\'s easy to escape the string delimiter.';
    var s4 = "It's even easier to use the other delimiter.";
    
    字符串模板

    字符串模板与kotlin和php的一样,这里不加赘述了。但在dart中==运算比较的是字符串的内容,这点和kotlin是一样的。字符串拼接也是加号。

    多行字符串

    这有点类似于kotlin,或者<pre>:

    var s1 = '''
    You can create
    multi-line strings like this one.
    ''';
    
    var s2 = """This is also a
    multi-line string.""";
    

    dart中比较好的一点是,如果你想打印raw字符串,则可以加上r表示:

    var s = r'In a raw string, not even \n gets special treatment.';
    

    字符串字面量是一个编译时常量,可以赋值在const上,这点和kotlin一样的:

    // These work in a const string.
    const aConstNum = 0;
    const aConstBool = true;
    const aConstString = 'a constant string';
    
    // These do NOT work in a const string.
    var aNum = 0;
    var aBool = true;
    var aString = 'a string';
    const aConstList = [1, 2, 3];
    
    const validConstString = '$aConstNum $aConstBool $aConstString';
    // const invalidConstString = '$aNum $aBool $aString $aConstList';
    
    Lists

    或许大多数的语言中最常用的是数组,但dart中它是一个List对象下面是一个简单的dart list:

    var list = [1,2,3];
    

    这里的list变量会被分析为List<int>类型,如果你试图将一个非整形的值放入其中,就会产生异常。
    List和数组一样,也是从零开始的。
    List的用法和java的数组很像,但其实它就是一个对象。List有很多方便的工具方法。这里在后续章节中详述

    Maps

    Map和Java以及大多数语言的定义一样,都是只有一个唯一的key,这个key指定一个value。dart支持map字面量和Map类型:

    var gifts = {
      // Key:    Value
      'first': 'partridge',
      'second': 'turtledoves',
      'fifth': 'golden rings'
    };
    
    var nobleGases = {
      2: 'helium',
      10: 'neon',
      18: 'argon',
    };
    

    这里词法分析器会断定gifts是一个Map<String, String>类型,而nobleGases是一个Map<int, String>,如果你试图添加错误的类型,就会报错。

    你可以使用Map构造器来创建:

    var gifts = Map();
    gifts['first'] = 'partridge';
    gifts['second'] = 'turtledoves';
    gifts['fifth'] = 'golden rings';
    
    var nobleGases = Map();
    nobleGases[2] = 'helium';
    nobleGases[10] = 'neon';
    nobleGases[18] = 'argon';
    

    如果获取一个不存在的key的值,那么就会返回null。

    var gifts = {'first': 'partridge'};
    assert(gifts['fifth'] == null);
    

    length属性指代键值对的数量。

    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds';
    assert(gifts.length == 2);
    

    一个map可以是一个字面量:

    final constantMap = const {
      2: 'helium',
      10: 'neon',
      18: 'argon',
    };
    
    Runes

    在dart中Runes是一个UTF-32编码的字符串。Unicode定义了一个数字化的值给一个字符,但UTF-16定一个的字符串还是有限的,String要是想表达UTF-32的字符就需要一些特殊的语法。

    通常的表达Unicode的方法是\uXXXX,XXXX是一个四位的十六进制,例如(♥) is \u2665,如果要表达多于或者少于4个16进制数的时候就要使用一个大括号,例如:(😆) is \u{1f600}.

    String类又一些方法可以转换成Runes类型。codeUnits属性可以获取字符位数组。runes属性则可以生成Runes对象

    下面是一个测试用例:

    main() {
      var clapping = '\u{1f44f}';
      print(clapping);
      print(clapping.codeUnits);
      print(clapping.runes.toList());
    
      Runes input = new Runes(
          '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
      print(new String.fromCharCodes(input));
    }
    

    output:

    👏
    [55357, 56399]
    [128079]
    ♥  😅  😎  👻  🖖  👍
    

    相关文章

      网友评论

          本文标题:Dart之旅02:变量、类型

          本文链接:https://www.haomeiwen.com/subject/sntceqtx.html