美文网首页Flutter圈子FlutterFlutter中文社区
Flutter学习之Dart语言基础(内置类型)

Flutter学习之Dart语言基础(内置类型)

作者: Samlss | 来源:发表于2019-03-25 16:48 被阅读0次

    Dart支持以下内置类型:

    • numbers
    • strings
    • booleans
    • lists (也称为数组)
    • sets
    • maps
    • runes (用于在字符串中表示Unicode字符)
    • symbols
    Numbers

    dart中数字有两种变量:

    • int
      整数值不大于64位,取决于平台。Dart虚拟机中,值可以是-263 到 263 - 1

    • double
      64位(双精度)浮点数,由IEEE 754标准规定。

    • int 和 double都是num的子类

    num类型可进行加基本的运算,例如加减乘除,更多运算可以参考dart:math库

    整数是没有小数点的数字。 以下是定义整数的一些示例:

    var x = 1;
    var hex = 0xDEADBEEF; //十六进制
    

    如果数字包含小数,则为双精度数:

    var y = 1.1;
    var exponents = 1.42e5;
    

    从Dart 2.1开始,必要时整数会自动转换为双精度数:

     double z = 1; 
      print("$z"); //打印 -> 1.0
    

    以下是将字符串和数字互相转换的示例:

      // String -> int
      var one = int.parse('1');
      print('one: $one');
    
      // String -> double
      var onePointOne = double.parse('1.1');
      print('onePointOne: $onePointOne');
    
      // int -> String
      String oneAsString = 1.toString();
      print('oneAsString: $oneAsString');
    
      // double -> String
      String piAsString = 3.14159.toStringAsFixed(2);
      print('piAsString: $piAsString');
    
    //打印:
    //one: 1
    //onePointOne: 1.1
    //oneAsString: 1
    //piAsString: 3.14
    

    传统位移操作:

    assert((3 << 1) == 6); // 0011 << 1 == 0110
    assert((3 >> 1) == 1); // 0011 >> 1 == 0001
    assert((3 | 4) == 7); // 0011 | 0100 == 0111
    
    Strings
    • Dart 字符串是使用UTF-16 编码的,可以使用单引号或者双引号来创建字符串
    • 可以使用三个单引号或者双引号创建多行字符串对象
    • 可以使用 r 前缀创建”原始raw”字符串。
    • 可以在字符串中使用表达式: ${expression},如果表达式是一个标识符,可以省略 {},如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。

    创建字符串:

    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.";
    

    多行字符串:

    var string1 =
    '''
    A
    multiline
    string
    ''';
    
    var string2 =
    """
    Another
    multiline
    string
    """;
    
    print(string1);
    print(string2);
    
    //打印:
    A
    multiline
    string
    
    Another
    multiline
    string
    

    连接字符串:

    var s1 = 'String '
        'concatenation'
        " works even over line breaks.";
    
    var s2 = 'The + operator ' + 'works, as well.';
    
    //打印:
    //String concatenation works even over line breaks.
    //The + operator works, as well.
    

    原始Raw字符串(原始字符串是比较特殊的字符串,在原始字符串中,字符“\” 不再表示转义字符的含义):

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

    表达式字符串:

    
    class Expression{
    
      String getName() => 'Expression';
    
      @override
      String toString() {
        return 'This is in Expression class';
      }
    }
    
    void main() {
      var expression = new Expression();
      print(expression);
      print('name: ${expression.getName()}');
    }
    
    //打印 ->
    //This is in Expression class
    //name: Expression
    
    Booleans

    为了表示布尔值,Dart有一个名为bool的类型。 只有两个对象具有bool类型:boolean true和false,它们都是编译时常量。

    Dart中bool对象未初始化的默认值是null:

    bool bb;
    
    if (bb == false){
    
      print('It\s false.');
    
    } else{
    
      print('It\s true.');
    
    }
    
    //打印 -> 
    //Its true.
    

    因为bb为null,所以不等于false,因此这里打印null。

    Lists

    也许几乎每种编程语言中最常见的集合是数组或有序的对象组。 在Dart中,数组是List对象,因此大多数人只是将它们称为List。
    这是一个简单的Dart列表:

    var list = [1, 2, 3];
    
    //打印 ->
    //[1, 2, 3]
    

    Dart中可以直接打印list包括list的元素,List也是对象。java中直接打印list结果是地址值。

    这里定义var list = [1, 2, 3]时,Dart推断list的类型为List <int>。 如果尝试将非整数对象添加到此列表,则分析器或运行时会引发错误。


    lists.png

    Dart中List的下标索引和java一样从0开始:

    var list = [5, 6, 7];
    for (int i = 0; i < list.length; i++){
      print('index$i = ${list[i]}');
    }
    
    //打印 ->
    //index0 = 5
    //index1 = 6
    //index2 = 7
    

    和java一样支持泛型

    generic.png

    常用操作:
    1.增删改查

    var list = [5, 6, 7];
    list.add(8); //增
    list.remove(8); //删
    list[0] = 55; //改
    bool containsSix = list.contains(6); //查
    print('containssix: $containsSix');
    
    print(list);
    
    //打印 ->
    //contains six: true
    //[55, 6, 7]
    

    2.倒序

    var list = [5, 6, 7];
    print(list);
    print('after reversed: ${list.reversed}'); //并不会改变原本list顺序
    print(list);
    
    //打印 ->
    //[5, 6, 7]
    //after reversed: (7, 6, 5)
    //[5, 6, 7]
    

    3.排序

    var list = ['AAA', 'AA', 'AAAA'];
    
    print('before sort: $list');
    list.sort((a, b) => a.length.compareTo(b.length)); //根据字符串长度排序
    print('after sort: $list');
    
    //打印 ->
    //before sort: [AAA, AA, AAAA]
    //after sort: [AA, AAA, AAAA]
    

    4.洗牌

    var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    print('before suffle: $list');
    list.shuffle();
    print('after suffle: $list');
    
    //打印 ->
    //before suffle: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    //after suffle: [8, 3, 2, 7, 5, 9, 4, 1, 6]
    

    5.合并

    var list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    var list2 = [11, 12, 13, 14, 15, 16, 17, 18, 19];
    
    var list3 = list1 + list2;
    print('list3: $list3');
    
    //打印 ->
    //list3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    
    Sets

    Dart中的集合(set)是没有顺序且不能重复的集合,所以不能通过索引去获取值:

    Set<String> set = new Set();
    set.add('A');
    set.add('B');
    set.add('C');
    set.add('D');
    set.add('E');
    set.add('F');
    set.add('G');
    set.add('A');
    set.add('B');
    
    //打印 >
    //{A, B, C, D, E, F, G}
    
    set.png

    常用操作:
    1.difference: 返回set1集合里有但set2里没有的元素集合

    Set<String> set1 = new Set();
    set1.add('A');
    set1.add('B');
    set1.add('C');
    set1.add('D');
    set1.add('E');
    set1.add('F');
    
    
    Set<String> set2 = new Set();
    set2.add('A');
    set2.add('1');
    set2.add('2');
    set2.add('3');
    set2.add('4');
    set2.add('5');
    
    print('difference: ${set1.difference(set2)}');
    
    //打印 ->
    //difference: {B, C, D, E, F}
    

    2.交集intersection: 返回set1和set2的交集

    Set<String> set1 = new Set();
    set1.add('A');
    set1.add('B');
    set1.add('C');
    
    
    Set<String> set2 = new Set();
    set2.add('A');
    set2.add('A');
    set2.add('B');
    set2.add('1');
    
    print('intersection: ${set1.intersection(set2)}');
    
    //打印 ->
    //intersection: {A, B}
    

    3.并集union:返回set1和set2的并集

    Set<String> set1 = new Set();
    set1.add('A');
    set1.add('B');
    set1.add('C');
    
    
    Set<String> set2 = new Set();
    set2.add('1');
    set2.add('2');
    set2.add('3');
    
    print('union: ${set1.union(set2)}');
    
    //打印 ->
    //union: {A, B, C, 1, 2, 3}
    

    4.retainAll():set1保留某些元素(删除所有set1中有而set2中没有的元素即保留set1和set2同时存在的元素)

    Set<String> set1 = new Set();
    set1.add('1');
    set1.add('2');
    set1.add('E');
    set1.add('F');
    set1.add('G');
    
    Set<String> set2 = new Set();
    set2.add('A');
    set2.add('B');
    set2.add('C');
    set2.add('1');
    set2.add('2');
    set2.add('3');
    
    set1.retainAll(set2);
    print('retainAll: $set1');
    
    //打印 ->
    //retainAll: {1, 2}
    
    Maps

    通常,map是关联键和值的对象,dart中可以通过以下方式创建map:

    //类型为Map<String, String>
    var gifts = {
      // Key:    Value
      'first': 'partridge',
      'second': 'turtledoves',
      'fifth': 'golden rings'
    };
    
    //类型为Map<int, String>
    var nobleGases = {
      2: 'helium',
      10: 'neon',
      18: 'argon',
    };
    
    print(gifts);
    print(nobleGases);
    
    //打印 ->
    //{first: partridge, second: turtledoves, fifth: golden rings}
    //{2: helium, 10: neon, 18: argon}
    

    如果尝试将错误类型的值添加到任一映射,则分析器或运行时会引发错误(这里gifts添加一个key为2value为what的数据)


    map.png

    也可以使用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';
    
    //打印 ->
    //{first: partridge, second: turtledoves, fifth: golden rings}
    //{2: helium, 10: neon, 18: argon}
    

    常用操作:
    1.新增键值对

    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds'; 
    
    print(gifts);
    
    //打印 ->
    //{first: partridge, fourth: calling birds}
    

    2.获取一个值

    var gifts = Map();
    gifts['first'] = 'partridge';
    gifts['second'] = 'turtledoves';
    
    print("first: ${gifts['first']}");
    print("second: ${gifts['second']}");
    print("fifth: ${gifts['fifth']}"); //map中并没有该键值对,返回null
    
    //打印 ->
    //first: partridge
    //second: turtledoves
    //fifth: null
    

    3.两个map相加:

    var map1 = {
    'a' : 10,
    'b' : 11,
    'c' : 12,
    };
    
    var map2 = {
    'a' : 10,
    'e' : 20,
    'f' : 21,
    'g' : 22,
    };
    
    map1.addAll(map2);
    print('map1 + map2 = $map1');
    
    //打印 ->
    //map1 + map2 = {a: 10, b: 11, c: 12, e: 20, f: 21, g: 22} 
    
    Runes

    在Dart中,runes是字符串的UTF-32代码点。
    由于Dart字符串是UTF-16代码单元的序列,因此在字符串中表示32位Unicode值需要特殊语法。

    我们知道, 在Unicode字符集中的某个字符对应的代码值,称作代码点(Code Point),用16进制表示,通常加上U+前缀,Dart中则为\u。比如,‘你’的代码点是\u4f60;‘好’的代码点是\u597d。要指定多于或少于4个十六进制数字,请将值放在大括号中, 例如,笑的表情符号(😆)是\u {1f600}。

    我们这里需要了解两个概念:
    代码点(code point):是指编码字符集中,字符所对应的数字,占用一个 Unicode 编码位的字符。有效范围从U+0000到U+10FFFF。其中U+0000到U+FFFF为基本字符,U+10000到U+10FFFF为增补字符。

    代码单元(code unit):表示指定编码格式编码的数量,对于小于 U+FFFF 的字符来说,使用 UTF-16 编码需要一个代码点,大于 U+FFFF 的字符需要使用两个代码点来表示。

    更多Unicode相关知识可自行百度。

    以下示例说明了runes,16位代码单元和32位代码点之间的关系:

    var clapping = '\u{1f44f}';  //创建一个使用UTF-16编码的string
    print(clapping);
    print('string code unit: ${clapping.codeUnits}'); //两个代码单元
    print('string code point: ${clapping.runes.toList()}'); //一个代码点
    
    Runes runes = new Runes('\u{1f44f}'); //创建一个使用UTF-32编码的Runes
    print('runes code point: ${runes.toList()}'); //一个代码点
    
    //打印-> 
    //👏
    //string code unit: [55357, 56399]
    //string code point: [128079]
    //runes code point: [128079]
    

    可以看到使用UTF-16编码的clpping的代码点和使用UTF-32编码的Runes是一样的,那Runes到底作用是什么?
    Runes其实是一个用UTF-32进行编码的的String。

    var sInput =  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'; //使用UTF-16进行编码
    Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}'); //使用UTF-32进行编码
    
    print(new String.fromCharCodes(input)); //UTF-32转UTF-16的时候调用了fromCharCodes
    print(sInput);
    
    //打印 ->
    //♥  😅  😎  👻  🖖  👍
    //♥  😅  😎  👻  🖖  👍
    

    方法源码为:

    external factory String.fromCharCodes(Iterable<int> charCodes,
          [int start = 0, int end]);
    

    如果传递的charCodes为UTF-16的代码单元,则逐字复制
    如果传递的charCodes的值大于16位,则将其分解为代理项对:

    var clef = new String.fromCharCodes([0x1D11E]); //大于 FFFF
    clef.codeUnitAt(0); // 0xD834
    clef.codeUnitAt(1); // 0xDD1E
    
    Symbols

    主要是反射用,现在mirrors模块已经被移除


    Symbols.png

    相关文章

      网友评论

        本文标题:Flutter学习之Dart语言基础(内置类型)

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