Dart入门(二)变量、函数、运算符、分支与循环
❤️【Dart学习】-- Dart之函数声明&&匿名函数&&自执行方法
支持顶级方法(即不与类绑定的方法,如上的 main
方法),以及绑定类和实例的方法(分别对应静态方法和实例方法),而且还支持方法嵌套(同 Python 和 JS)。
支持顶级变量,以及在类中定义的变量(如静态变量和实例变量)。
一、变量
1、声明并初始化
// 类型推断,使用var定义的变量不能改变数据类型 var name = 'Bob'; // 显示指定类型 String name = 'Bob'; //dynamic
或Object
可改变数据类型 dynamic name = 'Bob';
Dart 中声明时如果未初始化,会被自动初始化为null
:
2、final 与 const
// 此时不能在对列表a进行更新操作 var a = const [1, 2]; // a[0] = [4]; 会报错 // foo 与baz不能修改 var foo = const []; const baz = []; foo = [1, 2, 3]; baz = [42]; //报错 Error: Constant variables can't be assigned a value.
3、字符串
"+"操作符拼接字符串
插值表达式"${}"
4、数组
用...或者...?避免空异常
var list = []; var list2 = [0, ...list]; print(list2);
通过 if
或者 for
条件运算符来插入元素:
var nav = [ 'Home', 'Furniture', 'Plants', if (promoActive) 'Outlet' ]; var listOfInts = [1, 2, 3]; var listOfStrings = [ '#0', for (var i in listOfInts) '#$i' ];
5、Map
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings'; // 或者通过以下方式 var gifts = { // Key: Value 'first': 'partridge', 'second': 'turtledoves', 'fifth': 'golden rings' };
6、Set是无序的唯一项的集合
var names = <String>{}; Set<String> names = {}; // This works, too. // var names = {}; // Creates a map, not a set.
二、函数
void say() { print('123'); } // 该写法与以上有同样效果 void say2() => print('123');
函数同样支持类型推断
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null; // 与下面的效果一样 isNoble(atomicNumber) => _nobleGases[atomicNumber] != null;
可选参数
命名可选参数:用 { } 来指定,@required标注不想被忽略
位置可选参数:用 [ ] 来指定
命名可选参数
与位置可选参数
的区别,前者中的参数与顺序无关,无需按顺序传参,且传参数时需使用冒号;后者与顺序相关,传参必须依照顺序
命名可选参数
void main() { hello(name: 'Tom'); } void hello({@required String name='Jack', int age=18}) { print('Hello, my name is $name, i\'m $age years old.'); }
位置可选参数
void main() { sayHello('Tom', 19); } void sayHello(String name, int age, [String hobby = null]) { var result = 'Hello, my name is $name, i\'m $age years old'; if (hobby != null) { result += ', my bobby is $hobby.'; } print(result); }
匿名函数
【Dart学习】-- Dart之函数声明&&匿名函数&&自执行方法
// 定义匿名函数,并将其赋值给一个变量func,注意,函数体最后的花括号处必须有分号结束。 var func = (x,y){ return x + y; }; print(func(10,11)); // 21
箭头函数与匿名函数相结合
var loge = (msg) => Logger.print(Logger.Error, msg); void main() { loge("there has some errors"); }
Dart 中 list 就提供了匿名函数 —— forEach
,如:
var list = ['apples', 'bananas', 'oranges']; list.forEach((item) { print('${list.indexOf(item)}: $item'); });
三、运算符
- 比较运算符:
>
,<
,<=
,>=
,==
- 算数运算符:
+
,-
,*
,/
,%
,~/
- 位运算符:
|
,&
,^
,~
,<<
,>>
- 方括号运算符:
[]
,[]=
三目运算 condition ? expr1 : expr2
~/ 整除
is 是对象指定类型
is! 不是对象指定类型
as类型转换
(p as Person).name = 'Bruce';
非空条件判断符??
expr1 ?? expr2 如果expr1的值不等于
null
,则返回其值; 否则执行表达式expr2并返回其结果。
级联运算符:假如类Person有三个方法,setName
、setAge
、save
,则可如下调用
new Person()..setName("Bob")..setAge(20)..save();
条件成员访问符?.
它和.
类似,但是运算符左边的对象不能为null
,否则返回null
,若对象不为null
,则返回对象本身。
// list1默认值为null List list1; print(list1?.length); // null List list2 = []; print(list2?.length); // 0
四、分支与循环
if
条件分支
if(i < 0){ print('i < 0'); }else if(i == 0){ print('i = 0'); } else { print('i > 0'); }
switch
条件分支
String command = 'OPEN'; switch (command) { case 'CLOSED': break; case 'OPEN': break; default: print('Default'); }
基本循环
// for循环 for(int i = 0; i < 9; i++) { print(i); } // while循环 while(true){ //do something } // do-while循环 do{ //do something } while(true);
特有循环
var myList = ['Java','JavaScript','Dart']; // for...in...循环,类似Java中的增强for for (var it in myList ){ print(it); } // forEach循环。其参数为一个Function对象,这里传入一个匿名函数 myList.forEach((var it){ print(it); }); // 可以使用匿名箭头函数简写 myList.forEach((it) => print(it));
使用循环遍历Map
var myMap = { 'zhangsan':'201901', 'lisi':'201902', 'wangwu':'201902' }; // forEach遍历Map myMap.forEach((k, v) => print("$k : $v")); // 根据键获取值来遍历。通过keys返回Map中所有键的集合 for(var k in myMap.keys){ print("$k : ${myMap[k]}"); }