且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Dart基础-变量与类型

更新时间:2022-09-16 21:31:12

基本的Dart项目

//定义一个函数
printNumber(num aNumber) {
  //打印到控制台
  print('数字是:$aNumber');
}

//程序从这里开始执行
main(List<String> arguments) {
  //声明并初始化一个变量
  var number = 42;
  //调用一个函数
  printNumber(number);
}

代码中用到的知识点如下

//这是一个注释
表示后面是注释,另外还可以使用/*...*/

num
一种类型,其他的内置类型有String、int和bool

42
文字,在编译时是常量

print()
一种方便输出显示的方式

'...'"..."
一个字符串

$aNumber和${aNumber}
在字符串中插入变量或表达式

main()
入口函数

var
声明一个任意类型的变量

注意:
dart的缩进为两个空格
和java不同,dart没有public、protected和private这些关键字,如果标识符前面加“_”,就是私有变量或者函数

变量

下面的例子创建变量并分配一个值

var name = 'Bob';

默认值

//所有变量最初都是null
int lineCount;
//assert在生产模式下会被忽略,在检查模式下非真就抛出一个异常
assert(lineCount == null);

final和const

如果你不打算改变一个变量,可以使用final和const,它们可以替代任何类型,只能在声明时初始化,且不能改变,const如果在类级要用static const标记成静态常量

final name = 'Bob';
//name = 'Alice';  执行会出错
final monicker = name + '123';

const bar = 1000000;
//bar = 2000000;  执行会出错
const atm = 1.01325 * bar;

从使用上根本看不出区别,它们的区别在于,const是编译器常量,它的值在编译期就可以确定,final是运行时常量,它的初始值要到编译时才能确定,使用final能让程序启动更快

内置类型

数字

int

整数值,范围通常在-32768到32767之间,num的子类型

int x = 1;
int hex = 0xDEADBEEF;
int bigInt = 34653465834652437659238476592374958739845729;

double

64位双精度浮点数,按照IEEE754的标准,num的子类型

double y = 1.1;
double exponents = 1.42e5;

数字与字符串的转换

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

//String -> double
double 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');

位运算

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

字符串

dart的字符串是UTF-16编码的序列,可以用单引号或双引号创建字符串

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

使用${expression}在字符串中插入表达式,如果是标识符,可以省略{ },如果要获取对象对应的字符串,可以使用toString()方法

String s = 'string interpolation'

assert('Dart has $s, which is very handy.' ==
      'Dart has string interpolation, which is very handy.');
assert('That deserves all caps. ${s.toUpperCase()} is very handy!' ==
      'That deserves all caps. STRING INTERPOLATION is very handy!');

使用相邻方式或“+”都可以连接字符串

String s1 = 'String ' 'concatenation' " works even over line breaks.";
assert(s1 == 'String concatenation works even over line breaks.');

String s2 = 'The + operator ' + 'works, as well.';
assert(s2 == 'The + operator works, as well.');

使用三重单引号或三重双引号可以创建多行字符串

String s1 = '''
You can create
multi-line strings like this one.
''';

String s2 = """This is also a
multi-line string.""";

通过加前缀“r”可以创建原始字符串

String s = r"In a raw string, even \n isn't special.";

通过转义可以使用Unicode码

// \u2665 -> 
print('Unicode escapes work: \u2665');

布尔值

dart的布尔类型bool,只有两个布尔常量,true和false

String name = 'Bob';
if (name != null) {
  print('You have a name!');
}

列表

在dart中,数组是List对象,所以通常叫列表

List list = [1, 2, 3];

列表索引从0开始,是第一个元素,list.length-1是最后一个元素

List list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

映射

通常Map是关联key和value的对象,key和value可以是任何对象,key是唯一的,value可以重复

Map gifts = {
  //Keys      Values
  'first' : 'partridge',
  'second' : 'turtledoves',
  'fifth' : 'golden rings'
};

Map nobleGases = {
  //Keys  Values
  2  : 'helium',
  10 : 'neon',
  18 : 'argon',
};

可以使用Map构造函数创建和上面相同的对象

Map gifts = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

Map nobleGases = new Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

在现有的Map中添加一个新的键-值对

Map gifts = {'first' : 'partridge'};
//添加一个键-值对
gifts['fourth'] = 'calling birds';

在Map中检索值

Map gifts = {'first' : 'partridge'};
assert(gifts['first'] == 'partridge');

查找不存在的key,会返回null

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

使用.length可以获取Map中键-值对的数量

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