Dart语法基础-2基础类型

2020-09-08  本文已影响0人  tp夕阳武士

1. 数据类型

对于数值来说,我们也不用关心它是否有符号,以及数据的宽度和精度等问题。只要记着整数用int,浮点数用double就行了。
不过,要说明一下的是Dart中的intdouble可表示的范围并不是固定的,它取决于运行Dart的平台。

// 1.整数类型int
int age = 18;
int hexAge = 0x12;
print(age);
print(hexAge);

// 2.浮点类型double
double height = 1.88;
print(height);

字符串和数字之间的转化:

// 字符串和数字转化
// 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.布尔类型

// 布尔类型
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

集合类型分: List / 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定义:

// 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的定义
// 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 }
上一篇下一篇

猜你喜欢

热点阅读