Dart语法基础-2基础类型
2020-09-08 本文已影响0人
tp夕阳武士
1. 数据类型
对于数值来说,我们也不用关心它是否有符号,以及数据的宽度和精度等问题。只要记着整数用int
,浮点数用double
就行了。
不过,要说明一下的是Dart
中的int
和double
可表示的范围并不是固定的,它取决于运行Dart
的平台。
// 1.整数类型int
int age = 18;
int hexAge = 0x12;
print(age);
print(hexAge);
// 2.浮点类型double
double height = 1.88;
print(height);
字符串和数字之间的转化:
- ${实例名} //这就是打印某个实例时的语法方式;
-
Dart
语法的字符串类型和Swift
一样可以:插入,截取等操作;
// 字符串和数字转化
// 1.字符串转数字
var one = int.parse('111');
var two = double.parse('12.22');
print('${one} ${one.runtimeType}'); // 111 int
print('${two} ${two.runtimeType}'); // 12.22 double
// 2.数字转字符串
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2); // 保留两位小数
print('${num1Str} ${num1Str.runtimeType}'); // 123 String
print('${num2Str} ${num2Str.runtimeType}'); // 123.456 String
print('${num2StrD} ${num2StrD.runtimeType}'); // 123.46 String
2.布尔类型
- 布尔类型中,
Dart
提供了一个bool
的类型, 取值为true
和false
; - 如果熟悉
Swift
语法的布尔类型的,可以不用看这一节;
// 布尔类型
var isFlag = true;
print('$isFlag ${isFlag.runtimeType}');
注意: Dart中不能判断非0即真, 或者非空即真
Dart的
类型安全性意味着您不能使用if(非booleanvalu
)或assert(非booleanvalue
)之类的代码。
var message = 'Hello Dart';
// 错误的写法
if (message) {
print(message)
}
3.字符串类型
Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串:
// 1.定义字符串的方式
var s1 = 'Hello World';
var s2 = "Hello Dart";
var s3 = 'Hello\'Fullter';
var s4 = "Hello'Fullter";
可以使用三个单引号或者双引号表示多行字符串:
// 2.表示多行字符串的方式
var message1 = '''
哈哈哈
呵呵呵
嘿嘿嘿''';
字符串和其他变量或表达式拼接: 使用${expression}
, 如果表达式是一个标识符, 那么{}
可以省略
// 3.拼接其他变量
var name = 'coderwhy';
var age = 18;
var height = 1.88;
print('my name is ${name}, age is $age, height is $height');
4. 集合类型 List / Set / Map
集合类型分: Lis
t / Set
/ Map
,分别对应的是Swift的: Array
/ Set
/ Dictionary
4.1List
List 定义:
// List定义
// 1.使用类型推导定义
var letters = ['a', 'b', 'c', 'd'];
print('$letters ${letters.runtimeType}');
// 2.明确指定类型
List<int> numbers = [1, 2, 3, 4];
print('$numbers ${numbers.runtimeType}');
4.2 Set
Set定义:
-
Dart
语法中Set和Swift语法遵循同样的规则; - 无序的,不重复的
// Set的定义
// 1.使用类型推导定义
var lettersSet = {'a', 'b', 'c', 'd'};
print('$lettersSet ${lettersSet.runtimeType}');
// 2.明确指定类型
Set<int> numbersSet = {1, 2, 3, 4};
print('$numbersSet ${numbersSet.runtimeType}');
4.3 Map
Map的定义:
- Map就是常见的字典类型
// Map的定义
// 1.使用类型推导定义
var infoMap1 = {'name': 'why', 'age': 18};
print('$infoMap1 ${infoMap1.runtimeType}');
// 2.明确指定类型
Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
print('$infoMap2 ${infoMap2.runtimeType}');
4.4 常见的集合操作:
1.获取集合长度:
//获取数组的长度
List aaa = [1, 2, 3, 4, 5, 6];
print(aaa.length);
//获取Set的元素个数
Set bbb = {1, 2, 3, 4, 5, 5, 5, 5};
print(bbb.length); //打印结果5;
//因为bbb是Set类型,不允许有重复元素,系统会自动取出重复元素;
//获取字典的键:值 对数
Map ccc = {'key1': 1, 'key2': 'value2', 'key3': false};
print(ccc);
print(ccc.length);
2.添加/删除 操作
// List
List aaa = [1, 2, 3, 4, 5, 6];
aaa.add(7); // [1, 2, 3, 4, 5, 6, 7]
aaa.insert(3, 8); //[1, 2, 3, 8, 4, 5, 6, 7]
aaa.remove(1); //[2, 3, 8, 4, 5, 6, 7]
var index = aaa.indexOf(3); //3的index值是1;
var value = aaa.elementAt(1); //aaa的index = 1 的值是 3;
//Set
Set bbb = {1, 2, 3, 4, 5};
bbb.remove(1);
bbb.add(6);
//Map
Map ccc = {'key1': 1, 'key2': 111, 'key3': false};
ccc['key4'] = 'test';
print(ccc); //{key1: 1, key2: value2, key3: false, key4: test}
ccc.remove('key1');
print(ccc); //{key2: value2, key3: false, key4: test}
print(ccc.keys); //(key2, key3, key4)
print(ccc.values); //(value2, false, test)
print('${ccc.containsKey('key5')} ${ccc.containsValue(111)}'); // false true
print(ccc.entries); //(MapEntry(key2: value2), MapEntry(key3: false), MapEntry(key4: test))
4. dynamic & Object
dynamic
//这个方法运行时会报错,但是编译器编译不报错;
void testDynamic() {
//dynamic 编译时不会揣测数据类型,但是运行时会推断
dynamic s1 = 'string';
dynamic a1 = 1;
var result = s1 + a1;
print(s1.runtimeType);
print(result);
//上面这个代码编译时不会报错,但是运行时会报错;
//运行时报错内容:type 'int' is not a subtype of type 'String' of 'other'
//我们在来看一个:
s1.foo();
//s1这个实例,并没有包含foo();这个方法,但是调用的时候,编译器并不报错;
//运行时就会报错,提示没有找到这个方法;
}
Object
void testObject() {
//Object
Object object = "hello world";
print(object.runtimeType); //String
print(object); //hello world
Object object2 = 1;
var result = object + object2;
//编译器会推断出这个类型不一致,直接报错
print(object.runtimeType); //int 说明类型是可变的
print(object); //1
//object.foo();静态类型检查会运行报错会报错
}
//所以 Object 在运行时是有类型推断的;
5.枚举类型
main(List<String> args) {
final s = Season.winter;
//使用switch分支语法,对枚举进行判断
switch (s) {
case Season.spring:
print('s 是春天');
break;
case Season.summer:
print('s 是夏天');
break;
case Season.autumn:
print('s 是秋天');
break;
case Season.winter:
print('s 是冬天');
break;
default:
print('啥也不是');
}
}
//定义一个枚举类型;
enum Season { spring, summer, autumn, winter }