原文地址:https://www.jianshu.com/p/beb9325d2196
1 list
dart 中的list 在没有指定泛型的情况下 默认是object的
所以如下写法是可以的
void main() {
List list = new List();
list.add("aa");
list.add(1);
list.add(1.2);
print(list);
}
当指定泛型 比如list<int> 以上写法就会报错
2 map
dart 中不存在接口的概念
基本操作
Map<String,Object> map = new Map<String,Object>();
map['abc'] = 'bbb';
print(map);
map.containsKey("abc"); //是否存在当前key true
map.containsValue("bbb");//是否存在当前value true
map.isEmpty;//false
map.isNotEmpty;//true
map.keys;//获取所有的key [abc]
map.values;//获取所有的value [bbb]
3 set
基本操作
void main(){
Set set = new Set();
Set newSet = new Set();
newSet.add("bac");
set.add("daba");
set.remove("daba");
Set unionSet = set.union(newSet);//可以和其他的set拼接,返回合并的集合
set.add(1);
set.add([1,2,3]);
print(set);//{1, [1, 2, 3]}
print(unionSet);//{bac}
}
4 集合遍历
基本操作
void main(){
Map<String,Object> map = new Map<String,Object>();
map['abc'] = 'abc';
map['bbb'] = 'abc';
map.forEach((key,value){
print(key+",value:"+value);//abc,value:1 bbb,value:3
});
List list = ['1','a','pdc'];
for(int i = 0;i<list.length;i ++){
print('value:'+list[i]); //value:1 value:a value:pdc
}
Set set = {'abc',1212,'bbb'};
//set和list之间可以直接使用toList或者toSet方法进行转换,但是map不可以直接进行转换!map需要转换成list或者set可以选择获取keys/values进行toList/toSet转换操作
set.toList().forEach((value){
print(value); //abc 1212 bbb
});
}
5 动态变量类型
var
var的特性我们在js中都很熟悉,可以随意给var类型的变量赋值,但是在dart中,var只是可以让你后期再申明具体的类型,并不是可以任意改动类型(面向对象语言通病),如果你在申明了一次变量以后,再去设置一个新的类型,那么编译器就会直接抛出异常
var t;
t="hi world";
t=1000;// 下面代码在dart中会报错,因为变量t的类型已经确定为String,
dynamic
在dart中存在一个情况,我们前期不确定这个类型,但是后期又想修改掉怎么办?var不能修改类型,有木有这种完全动态的类型呢?有,dynamic关键字就是完全动态的类型,和var的区别在于,var是在编译期就确定了类型,也就是说当第一次申明以后就确定了类型,而dynamic是属于运行时动态类型,也就是说你可以任意修改类型或者申明,只要最终运行的时候能确定类型,使用如下:
dynamic t;//很坑的是这个类型目前的dart插件居然没有代码提示必须全部写完才出现,不能判断正确性
t = "hi world";
t = 1000;//可以进行修改申明类型
print(t);//输出为:1000
Object
dart这个语言和java一样,一切都是对象,并且一切对象的基类都是Object,所以在dart中同样支持使用Object来申明任意类型,并且Object无限制可以接受任何类型,那么Object和dynamic的区别在哪呢?两者都可以动态接受类型并且都是运行时确定类型的啊,别急,我们看一个简单的案例:
dynamic a = "a";
Object b = "b";
void main() {
print(a.length);//这里可以调用length属性,完美输出
print(b.length);//这里是object类型就不能调用length方法,编译就报错
}
从上面的案例就能看出来区别,dynamic属于动态改变的类型,也就是说编译器会根据你申明的类型自动推断为该类型,所以该类型的所有的属性都可以使用,但是使用Object的类编译器无法推断具体类型,默认为还是Object类型,所以只能调用Object的属性和方法,而Object中不存在length,所以就会报错,所以总结下来,Object是需要手动转换具体类型来进行操作,而dynamic属于自动推断类型,调用该类型的属性,灵活度来说dynamic更高,但是按照代码的严谨性和可读性来说Object更高更不容易出错,所以一般来说,在大部分代码不是很严格的环境下,我们会选择dynamic来替代Object进行开发,提高灵活度
6 常量
const
dart中同时包含了js的const和final两个常量类型,在dart中const是编译常量,也就是说当const修饰了这个变量以后,如果再去修改,编译器直接就报错(这里应该是完全沿袭js中的const)
const str1 = "hi world";
str1 = "aaa";//编译器直接报错
var list = const [1, 2, 3];//const还可以修饰变量对应的值,强制让这个值也变成固定的
final
dart 中 final const 定义的定义的变量都不可以再修改 区别是final只能修饰变量
const 除了能修饰变量还可以修饰值
“ swift
final str1 = “hi world”;
str1 = “bbb”;//这里也会报错
并且使用const修饰的常量可以作为构造,如果构造是完全一样的,这时候使用的是同一个实例,用于提高编译和运行的效率
```swift
getConst() => const [1, 2];
main() {
var a = getConst();
var b = getConst();
identical(a, b); // =>true
}