var、final 和 const
var 关键字
void main() {
var a;
print(a);
a = 'hello world';
print(a);
a = 10;
print(a + 20);
var b = 10;
print(b);
}
- 使用
var
声明一个变量,可以赋值为不同的类型。 -
var
声明的变量如果没有初始化,那么变量的值为nil
。
final 关键字
- 使用
final
声明的变量只能被赋值一次,再次赋值的话会报错,它是最终变量。 - 使用
final
声明的变量在使用前必须有值,不然也会报错。
const 关键字
- 使用
const
声明的常量初始化的时候必须被赋值。 - 使用
const
声明的常量不能被修改。
Dart 的数据类型之 num
相对于 OC
来说 Dart
的数据类型会少很多,数值型 num
分为两种 int
跟 double
。
如图,num
类型的变量如果被使用的话必须要有值,double
类型的变量可以被重新赋值为 int
型数据,但是 int
型变量不能被重新赋值为 double
类型。
void main() {
int a = 10;
print(a.isEven); // 判断是否是偶数
print(a.isOdd); // 判断是否是奇数
// 运算符 + - * / % (取模) ~/ (取整数)
int b = a + 10;
int c = a - 5;
int d = a * 3;
double e = a / 2;
int f = a % 6;
int g = a ~/ 8; // 这个结果为 1,相当于 a 除 8 的结果取整
// 转换类型
int h = 10.3.toInt(); // double 类型转换为 int
double i = 5.toDouble(); // int 类型转换为 double
}
Dart 的数据类型之 String
void main() {
// 用单引号或者双引号修饰都可以
var a = 'hello';
var b = "world";
String c = a + b;
// 用 3 个引号修饰,字符串可以换行
String d = '''hello
world''';
// 获取字符串 a 中的第 0 个字符跟第 1 个字符,这里可以看到会非常方法,可以用下标的方式去取
print(a[0]);
print(a[1]);
String e = a * 2; // 这个结果等于 hellohello,就是把 a 的值再复制一份
int f = 10;
int g = 20;
int h = f + g;
print('a + b = ${a + b}'); // 输出结果为 a + b = 30,在字符串里面拼接运算表达式
print('a + b = $h'); // 这个结果跟上面输出结果是一样的
String str = "hello\nworld";
print(str); // 这个输出的结果就是 hello 换行之后是 world
String str1 = r"hello\nworld";
print(str1); // 这个输出的结果就是 hello\nworld, \n 没起作用
print(str1.length); // 打印字符串长度
}
更多的字符串使用方法,大家也可以点进去到 String
里面去看,光标移到 String
上面,按住 command
并点击鼠标。
Dart 的数据类型之 List & Map
Llist
Dart
中的 list
就相当于 oc
中的数组,但是稍微不同的是 list
中可以存储不同类型的元素,下面是 list
的一些用法。
void main() {
// 不可变 list,数据先去加 const 修饰
var list = const ['one', 'two', 'three', 1];
// 可变 list
var list1 = ['one', 'two', 'three', 1];
// 根据下标打印元素
print(list1[1]);
// 修改下标为 1 的元素
list1[1] = 3;
// 打印 list 元素数量
print(list1.length);
// 追加一个元素
list1.add(5);
// 在 下边为 1 的位置插入一个元素
list1.insert(1, '33');
// 删除某个元素
list1.remove('one');
// 清空 list
list1.clear();
var list2 = [1, 3, 2];
// 对 list 进行排序,得到的结果就是 [1, 2, 3]
list2.sort();
// 获取 list 下标 1 到 3 之间的元素
list2.sublist(1, 3);
}
Map
Dart
中的 Map
相当于 OC
中的字典,以键值对的形式存储。其中 List
也可以转换为 Map
,以下标为 key
,对应的元素为 value
。
void main() {
// 不可变 map
var map1 = const {'key1' : 'one','key2' : 'two'};
// 可变 map
var map2 = {'key1' : 'one','key2' : 'two'};
// 获取 key 对应的值
print(map2['key1']);
// 修改 key 对应的值
map2['key1'] = 'hello';
// 打印 map 的长度
print(map2.length);
// 获取 map 中所有的 value
print(map2.values);
// 获取 map 中所有的 key
print(map2.keys);
// 将 list 转为 map,结果就是 {0: one, 1: two, 2: three}
var list = ['one', 'two', 'three'];
var map3 = list.asMap();
}
Dart 中的运算符
这里介绍 Dart
中一些特意的运算符,别的都是跟其他语言一样,是一些通用的运算符。
void main() {
var a;
// 如果 a 没有值,就进行赋值,如果 a 有值就不会赋值
a ??= 10;
var b;
// 如果左边有值就打印左边,如果左边没值就打印右边
print(a ?? b);
}
Dart 中的方法跟箭头函数
在 Dart
中方法也是一个对象,返回值跟参数类型可以省略,当方法执行语句只有一句的时候可以使用箭头函数 =>
表达式。
void main() {
print(sum(10, 20));
print(sum1(10, 20));
print(sum2(10, 20));
}
// 正常写法
int sum(int a, int b) {
return a + b;
}
// 省略参数跟返回值
sum1(a, b) {
return a + b;
}
// 使用箭头函数 => 表达式
sum2(a, b) => a + b;
Dart 方法的可选参数
void main() {
// 这里方法调用的时候参数可选,但是可选参数必须带上形参的名称
print(sum(20));
print(sum(20, b: 10));
// 这里可以不用按照方法中的顺序传参
print(sum(20, c:5, b:10));
// 用 [] 修饰可选参数调用的时候可以不用带参数名称,但是必须按参数的顺序传值
print(sum3(20, 5, 10));
}
sum(a, {b, c}) {
b ??= 0;
c ??= 0;
return a - b + c;
}
// 参数如果为 int 型,就需要用 int?修饰,告诉编译器参数可以为空
sum1(a, {int? b, int? c}) {
b ??= 0;
c ??= 0;
return a - b + c;
}
// 也可以给参数一个默认值
sum2(a, {int b = 0, int c = 0}) {
return a - b + c;
}
// 用 [] 修饰可选参数调用的时候可以不用带参数名称,但是必须按参数的顺序传值
sum3(a, [int b = 0, int c = 0]) {
return a - b + c;
}
Dart 方法作为参数传递
Dart
是纯面向对象语言,方法也是一个对象,可以作为参数用来传递,这点有点类似 OC
中的 block
的作用。下面例子中我们定义一个 helloDemo
方法,可以用变量 hello
来接收并调用。以及参照系统方法定义了 forEachDemo
来遍历打印 list
中的元素,并把 printElement
方法作为参数来传递。
void main() {
var hello = helloDemo;
hello();
var list = [1, 2, 3, 4];
// list.forEach(print);
forEachDemo(list, printElement);
}
helloDemo() => print('hello');
forEachDemo(List list, void func(var element)) {
for (var e in list) func(e);
}
int b = 0;
printElement(var a) {
b++;
print('元素$b = $a');
}
Dart 中的匿名函数
void main() {
// 这里 () {} 部分属于匿名函数,但是需要用一个变量接收,才能被调用,匿名方法也可以作为参数传递
var func = () {
print('匿名方法');
};
func();
// 以 (() {}) () 这种形式实现的匿名函数会立即执行,属于立即执行函数
(() {
print('立即执行函数');
})();
}
Dart 中的闭包
闭包: 定义在函数里面的函数就是闭包,闭包也是一个对象。
闭包的作用:可以访问外部函数的局部变量。
理论上 return
之后函数执行完毕,函数中的变量就会被销毁,但是如图可以看到,我们连续执行了 3 次 func()
,变量 a
的值会被累加,并没有被销毁。这就是闭包的特点,只要我们拿到 func
这个变量,a
就会一直存在内存中。
网友评论