一.Hello Dart
1.1. 打印 print
print('hello dart');
// command + s 清理运行缓存
1.2. Dart程序分析
1.Dart语言的入口也是main函数,并且必须显示的进行定义;
2.Dart的入口函数main是没有返回值的;
3.传递给main的命令行参数,是通过List完成的。
从字面值就可以理解List是Dart中的集合类型。
其中的每一个String都表示传递给main的一个参数;
4.定义字符串的时候,可以使用单引号或双引号;
5.每行语句必须使用分号结尾,很多语言并不需要分号,比如Swift、JavaScript;
二.定义变量
2.1. 定义变量(Explicit)
/**
声明变量
变量类型 变量名称 = 赋值;
*/
String name = 'xiao ming';
int age = 18;
double height = 1.88;
print('$name, $age, $height');
2.2. 类型推导(Type Inference)
/**
var/dynamic/const/final 变量名称 = 赋值;
const/final 初始化必须赋值
*/
1.var
var name = 'name';
name = 'yh';
print(name.runtimeType);//String
2.dynamic 动态类型
// dynamic可以改变变量类型,通常情况下不使用dynamic, 因为类型的变化会带来潜在的危险
dynamic age = '180';
print(age.runtimeType);//String
age = 180;
print(age.runtimeType);//int
3.final & const
final和const都是用于定义常量的,也就是定义之后不可以修改
final name = 'yh';
// name = 'hy';//错误
const age = 18;
// age = 81;//错误
final和const区别
const在赋值时,赋值的内容必须是在编译期间就确定下来的
final在赋值时,可以动态获取,比如赋值一个函数;final一旦被赋值后就有确定的结果,不会再次赋值
void main(List<String> args) {
const name = getName();//错误的做法,因为要执行函数才能获取到值
final name2 = getName();
}
String getName() {
return 'yh';
}
const修饰赋值语句,只会使用同一份内存,可提高性能:
void main(List<String> args) {
final a = const Person();
final b = const Person();
print(identical(a, b));//true
final c = Person();
final d = Person();
print(identical(c, d));//false
}
class Person {
const Person();
}
三.数据类型
3.1. Int Double
//1.整数类型int
int age = 12;
int hexAge = 0x12;
print('$age,$hexAge');//12,18
//2.浮点型double
double height = 1.88;
//字符串与数字转换
//1.字符串转数字
var one = int.parse('111');
print('$one ${one.runtimeType}');//111 int
//2.数字转字符串
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(1);
print('$num1Str,$num2Str,$num2StrD');//123,123.456,123.5
3.2. bool
注意:Dart中不能判断非0即真,或者非空即真
var isFlag = true;
print('$isFlag,${isFlag.runtimeType}');//true,bool
var message = 'dart';
//错误写法
if (message) {
print(message);
}
3.3. String
Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串:
//单行字符串
var str1 = 'str1';
var str2 = "str2";
//多行字符串
var str3 = '''
1
2
3
''';
//字符串拼接
var str4 = '$str1,$str2,$str3';
print(str4);
}
3.4. 集合类型
1.集合类型的定义
List:数组 / Set:集合 / Map:字典(映射)
var letters = ['a','b','c'];
List<int> numsList = [1,2,3];
print('$letters,${letters.runtimeType},$numsList,${numsList.runtimeType}');
//[a, b, c],List<String>,[1, 2, 3],List<int>
Set<int> numsSet = {1,2,3,4};
print('$numsSet,${numsSet.runtimeType}');
//{1, 2, 3, 4},_CompactLinkedHashSet<int>
Map<String, Object> map = {'name': 'yh', 'height': 1.88};
print('$map,${map.runtimeType}');
//{name: yh, height: 1.88},_InternalLinkedHashMap<String, Object>
2.集合的常见操作
print(letters.length);
print(numsSet.length);
print(objsMap.length);
//list操作
//增,删,包含
numsList.add(5);
numsSet.add(5);
numsList.remove(1);
numsList.removeAt(1);
numsList.contains(4);
print(numsList);//[2, 5]
//map操作
//1.根据key获取value
print(objsMap['name']);//yh
//2.获取所有的entries
print('${objsMap.entries},${objsMap.entries.runtimeType}');//(MapEntry(name: yh), MapEntry(height: 1.88)),MappedIterable<String, MapEntry<String, Object>>
//3.all keys
print(objsMap.keys);//(name, height)
//4.all values
print(objsMap.values);//(yh, 1.88)
//5.contain key || contain value
print('${objsMap.containsKey('name')},${objsMap.containsValue('yh')}');//true,true
//6.remove from key
objsMap.remove('name');
print(objsMap);//{height: 1.88}
四.函数 Function
4.1 函数定义
//函数返回值可以省略
// 返回值 函数的名称(参数列表) {
// 函数体
// return 返回值
// }
void main(List<String> args) {
print(sum(1, 2));
print(sum2(1, 2));
}
int sum(num1, num2) {
return num1 + num2;
}
//注意:这里只能是一个表达式,不能是一个语句
sum2(num1, num2) => num1 + num2;
4.2 函数的参数
可选参数
注意, 只有可选参数才可以有默认值, 必须参数不能有默认值
//命名可选参数: {param1, param2, ...}
//位置可选参数: [param1, param2, ...]
//命名可选参数
optionParamsFun1(String name, {int age = 10, double height = 1.8}) {
print('$name,$age,$height');
}
//调用
optionParamsFun1('yh');
optionParamsFun1('yh',age: 20);
optionParamsFun1('yh',age: 20,height: 1.88);
// yh,10,1.8
// yh,20,1.8
// yh,20,1.88
//位置可选参数
optionParamsFun1(String name, [int age = 10, double height = 1.8]) {
print('$name,$age,$height');
}
optionParamsFun1('yh');
optionParamsFun1('yh', 20);
optionParamsFun1('yh', 20, 1.88);
// yh,10,1.8
// yh,20,1.8
// yh,20,1.88
4.3. 函数是一等公民
函数可以作为参数、返回值
//调用
test(getFunc());
//1.定义一个函数
foo(String name) {
print(name);
}
//2.将函数作为另一个函数的返回值
getFunc() {
return foo;
}
//3.将函数作为另一个函数的参数
test(Function func) {
func("func");
}
4.4. [匿名函数]
void main(List<String> args) {
//匿名函数
var movies = ['盗梦空间', '星际穿越', '少年派', '大话西游'];
//1.定义匿名函数
printElement(item) {
print(item);
}
movies.forEach(printElement);
//2.使用forEach遍历:匿名函数
movies.forEach((element) {
print(element);
});
movies.forEach((element) => print(element));
}
4.5. 词法作用域
dart中的词法有自己明确的作用域范围,它是根据代码的结构({})来决定作用域范围的
优先使用自己作用域中的变量,如果没有找到,则一层层向外查找。
var name = 'global';
main(List<String> args) {
// var name = 'main';
void foo() {
// var name = 'foo';
print(name);
}
foo();
}
4.6. [闭包]作用域
闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。
void main(List<String> args) {
sum(num m) {
return (num n) {
return m + n;
};
}
var func = sum(10);
print(func(10));//20
}
4.7. 返回值问题
所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。
main(List<String> args) {
print(foo()); // null
}
foo() {
print('foo function');
}
五.运算符
5.1.普通运算符
- 除法、整除、取余
var num = 7;
print(num / 3);//除 2.3333
print(num ~/ 3);//整除 2
print(num % 3);//取余 1
2.??=
//当变量不为null时使用变量,当变量为null时,后面的值将被赋值给变量
var name = 'lucy';
name ??= 'sala';
print(name);//lucy
var name2 = null;
name2 ??= 'Toms';
print(name2);//Toms
3.??
//当变量不为null时使用变量,当变量为null时使用后面的值
var name = 'lucy';
print(name ?? 'sala');//lucy
var name2 = null;
print(name2 ?? 'Toms');//Toms
5.2. 级联语法:…
对一个对象进行连续的操作,这个时候可以使用级联语法。
class Person {
String name = 'Tom';
void eat() {
}
void drink() {
}
void sleep() {
}
}
void main(List<String> args) {
final p1 = Person();
p1.name = 'Lucy';
p1.eat();
p1.drink();
p1.sleep();
//级联
final p2 = Person()
..name = "Tom"
..eat()
..drink()
..sleep();
}
5.3. if else
dart不支持非零即真,判断语句中必须有明确的bool类型
var isBool = true;
if (isBool) {
} else {
}
5.4. switch-case
var direction = 'east';
switch (direction) {
case 'east':
print('东方');
break;
case 'west':
print('西方');
break;
default:
print('其他方');
}
//东方
5.5. 循环
for、for in
var list = ['1','2','3'];
for (var i = 0; i < list.length; i++) {
print(list[i]);
}
for (var str in list) {
print(str);
}
//1 2 3
while do-while 与其他语法一致
break continue 与其他语法一致
六.枚举 enum
6.1.枚举的定义
枚举使用 enum关键字 来定义:
void main(List<String> args) {
print(Colors.red);
//枚举属性 index索引,从0开始;values包含所有枚举值的list
print(Colors.red.index);
print(Colors.values);
}
enum Colors {
red,
green,
blue
}
————————————————
版权声明:本文为CSDN博主「weixin_42580612」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42580612/article/details/124137706
网友评论