当前位置:首页 > 后端开发 > 正文内容

Flutter/Dart第08天:Dart类型(内置类型、记载、调集、泛型和类型别号)

邻居的猫1个月前 (12-09)后端开发1502

Dart内置类型(共10类)

Dart官网文档:https://dart.dev/language/built-in-types

Dart内置类型即Dart SDK自带的类型,咱们编程过程中可直接运用的类型,首要分为10类:

  1. 数值类型:包含int类、double类等。
  2. 字符串类型:即String类。
  3. 布尔类型:即bool类。
  4. 记载类型:即Record类,Dart 3中开端支撑(最新版别的Java 21也支撑)。
  5. 列表类型:即List类,一起也是数组。
  6. Set类型:即Set类。
  7. 映射类型:即Map类。
  8. 字符类型:与字符相关处理。
  9. 契合类型:即Symbol类。
  10. 特别值:null空值。

Dart中类型的其他一些规矩:

  1. Object类是Dart中除Null之外的一切类的基类。扩展问题:Dart中顶层类是什么呢?
  2. Enum类是Dart中一切枚举类的基类。扩展问题:Enum类是Object的子类吗?答案:是。
  3. dynamic类型Dart的静态检测会失效,简单引发空安全等其他运行时过错,主张运用Object或许Object?替代。
  4. FutureStream支撑异步编程。
  5. Never一般用于总是抛出反常的函数,标明表达式用于无法成功履行。
  6. void标明值不会被再次运用,一般用户函数回来值。

数字类型(int和double)

Dart中数字类型类结构如下:

image

intdouble都是num类的子类。int不超越64位的整数,double为64位双精度浮点数。

num类型支撑操作:加+,减-,乘*,除/abs()绝对值,ceil()向上取整,floor()向下取整操作。特别注意:操作,如>>右移或许<<左移等位操作,仅int类型支撑。

代码样例:如下代码,数字类型界说。

// int类型
var x = 1;
var hex = 0xDEADBEEF;

// double类型
var y = 1.1;
var exponents = 1.42e5;
double z = 1; // 等同于:double z = 1.0;

// num类型:既可所以整数,又可所以浮点数
num x = 1;
x += 2.5;

代码样例:如下代码,数字类型和字符串彼此转化。

// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

代码样例:如下代码,int类型操作。

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000

代码样例:如下代码,字面量数字归于编译时常量,因而字面量数字表达式也能够作为常量。

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

字符串类型(String)

Dart中字符串是一个UTF-16的序列码,咱们能够经过'单引号或许"双引号界说一个字符串、经过${}进行字符串插值、经过相邻字符串衔接、运用+符号进行衔接,经过3个单引号'''或许3个双引号"""界说多行字符串,还能够经过添加前缀r界说原始字符串。

代码样例:如下代码,字符串的各种界说办法。

// 引号:单引号或双引号
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";

// 插值
final name = 'Tom';
var s5 = 'My name is $name.';
assert(s5 == 'My name is Tome.');

// 相邻字符串
var s6 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s6 ==
    'String concatenation works even over '
        'line breaks.');

var s7 = 'The + operator ' + 'works, as well.';
assert(s7 == 'The + operator works, as well.');

// 多行字符串:3个单引号或3个双引号
var s8 = '''
My name is Tom.
I am a boy.
''';

var s9 = """
My name is Tom.
I am a boy.
""";

// 原始字符串
var s10 = r'My name is Tome.\nI am a boy.';

特别注意:==双等于号操作符在Dart中用于检测2个目标是否持平,假如是字符串,则是校验它们的序列码是否相同(这与Java有许多的差异)。

代码样例:如下代码,字面量字符串是编译时常量,假如字符串插值表达式中的变量是常量,那么插值字符串也是常量。

// 字面量字符串
const aConstString = 'a constant string';

// 插值字符串常量
const aConstNum = 0;
const aConstBool = true;
const validConstString = '$aConstNum $aConstBool $aConstString';

布尔类型(bool)

Dart中只要2个目标是bool类型:truefalse,且他们都是常量。

代码样例:如下代码,在表达式中的布尔类型。

// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);

// Check for null.
var unicorn = null;
assert(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

字符和符号(characters)

Dart中字符代表字符串中一个Unicode编码单元。Unicode为世界上的每个字母、数字和契合界说了一个仅有数字值。

由于Dart的字符串是UTF-16编码,因而Dart中表明Unicode有其对应的语法格局,常用的办法为\uXXXX代表一个字符,其间XXXX4位16进制的值。

举例说明:心形字符♥的值为\u2665,假如少于或许超越4位16制止值,则用{}包裹起来,如笑脸字符😁的值为\u{1f606}

代码样例:如下所示,一般咱们用characters库来操作字符。

import 'package:characters/characters.dart';

void main() {
  var hi = 'Hi 🇩🇰';
  print(hi);
  // 成果:Hi 🇩🇰
  
  print('The end of the string: ${hi.substring(hi.length - 1)}');
  // 成果:The end of the string: ???

  final charList = hi.characters;
  for (int i = 0; i < charList.length; i++) {
    print('The character $i = ${charList.elementAt(i)}');
  }
  // 成果:
  // The character 0 = H
  // The character 1 = i
  // The character 2 =  
  // The character 3 = 🇩🇰

  print('The last character: ${hi.characters.last}');
  // The last character: 🇩🇰
}

特别注意:如上代码,由于运用了characters库,因而需求在pubspec.yaml文件中添加依靠(如下完好装备)。

name: NTopicDart

environment:
  sdk: ^3.1.2

dependencies:
  characters: ^1.3.0

符号(Symbol)

有点类似于HTML中锚,#前缀,后边格局标识符。

记载类型(Record)

Dart官网文档:https://dart.dev/language/records

特别注意:记载类型需求Dart 3.0才开端支撑(Java从JDK 21开端支撑)。

Record记载类型是一个匿名的、不可变调集类型。有点儿像调集类型,它是多个目标元素的调集,不相同的是,记载巨细固定、异构和类型固定的。记载是一个详细的值,因而它能够作为变量、函数入参或成果、也能够嵌套(即记载中的元素是一个记载),也能够作为List/Set/Map等调集类的元素。

记载语法:

  1. ()括号包裹的,,逗号分隔的命名字段或许方位字段列表。
  2. 记载类型注解是用()括号包裹的,,号分隔的字段类型列表,它能够作为办法入参和成果的类型。
  3. 记载假如运用的是命名字段,那么字段名是记载界说的一部分,即2个记载,字段名不相同则是2个不同的记载。
  4. 记载的字段内置getters取值办法,可是没有setters设置办法,由于记载是不可变的。其间命名字段的字段名即取值办法,而方位字段则运用$<position>字段方位取值,而且疏忽一切的命名字段。
  5. 记载比较:假如2个记载相对,那么他们必须有相同的字段、相同的字段类型,现已字段具有相同的值。
  6. 记载可作为函数入参和回来值:当作为回来值,其实是一个函数能够回来多个值。
// 记载界说:方位字段+命名字段
var record = ('first', a: 2, b: true, 'last');

// 记载类型注解 
(int, int) swap((int, int) record) {
  var (a, b) = record;
  return (b, a);
}

// 记载界说和初始化
(String, int) record;
record = ('A string', 123);

({int a, bool b}) record;
record = (a: 123, b: true);

// 指令字段:字段名不相同,归于不同的记载(recordAB和recordXY是不同类型)
({int a, int b}) recordAB = (a: 1, b: 2);
({int x, int y}) recordXY = (x: 3, y: 4);


// 方位字段:类型相同即可,参数名不是记载界说的一部分
(int a, int b) recordAB = (1, 2);
(int x, int y) recordXY = (3, 4);
recordAB = recordXY;

// 取值办法:方位字段和命名字段的取值办法
var record = ('first', a: 2, b: true, 'last');
print(record.$1); // 成果:first
print(record.a);  // 成果:2
print(record.b);  // 成果:true
print(record.$2); // 成果:last

// 记载比较:相同字段、字段类型和字段值
(int x, int y, int z) point = (1, 2, 3);
(int r, int g, int b) color = (1, 2, 3);

print(point == color); // 成果:true

// 记载比较:命名字段称号不同
({int x, int y, int z}) point = (x: 1, y: 2, z: 3);
({int r, int g, int b}) color = (r: 1, g: 2, b: 3);

print(point == color); // 成果:false

调集类型(list/set/map)

Dart官方文档:https://dart.dev/language/collections

list、set、map的界说和用法:Flutter/Dart第03天:Dart可迭代调集

代码样例:如下代码,经过...list的办法能够打开一个调集;界说调集时,可添加操控流

// 打开非null的调集
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

// 打开为null的调集
var list3;
var list2 = [0, ...?list3];
assert(list2.length == 1);

// 条件判别
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];
var nav = ['Home', 'Furniture', 'Plants', if (login case 'Manager') 'Inventory'];

var listOfInts = [1, 2, 3];
var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
assert(listOfStrings[1] == '#1');

泛型类型

Dart官网文档:https://dart.dev/language/generics

泛型是编码中最常见的编码办法,本文不在赘述。

类型别号(typedef)

Dart官网文档:https://dart.dev/language/typedefs

类型别号:经过typedef关键字,能够给一个类型添加一个别号类型(现在还没有看到别号存在的必要🐶)。

// 类型别号
typedef IntList = List<int>;
IntList il = [1, 2, 3];

// 类型别号:感觉简略
typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {};
ListMapper<String> m2 = {};

// 类型别号:`不主张`把内联函数界说别号
typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True
}

我的本博客原地址:https://ntopic.cn/p/2023100301


扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=275

分享给朋友:

“Flutter/Dart第08天:Dart类型(内置类型、记载、调集、泛型和类型别号)” 的相关文章

一步步在 github pages 上用 jekyll 建立归于自己的博客

一步步在 github pages 上用 jekyll 建立归于自己的博客

序 我的专业与互联网没有太大联系,触摸博客仍是作业今后的作业。跟着作业的经历添加,总想将自己的所思所得记录下来,究竟,好记忆不如烂笔头。 开端是将自己的总结在本地保存,可是本地有一个下风,便是不能随时随地的检查,最重要的是,不能随时随地的装X,所以,最终转到了简书,转到简书,是17年的时分,那个...

Flutter/Dart第04天:Dart异步编程(Future和async/await)

Flutter/Dart第04天:Dart异步编程(Future和async/await)

Dart官网代码实验室:https://dart.dev/codelabs/async-await 重要阐明:本博客依据Dart官网代码实验室,但并不是简略的对官网文章进行翻译,我会依据个人研制经历,在掩盖官网文章核心内容情况下,参加自己的一些扩展问题和问题演示和总结,包含称号解说、运用场景阐明、代...

【日记】我不清楚所谓的男人气魄,到底是怎样界说的(738 字)

【日记】我不清楚所谓的男人气魄,到底是怎样界说的(738 字)

正文   今晚应付,现在还在继续,不知道还会继续多久。   应付场上的虚情假意、随俗应付,感觉没有最初那样厌恶反胃了。可是仍是不喜爱。   对喜爱喝酒和交际的人是享用,对我来说是尖端摧残。   今晚被作为典型人物被领导拎出来说,从某种意义上说给一种底层职工招引火力了。他说我要有些男人气魄,要能撑起一...

安装python,从入门到环境配置

安装Python是一个简单的过程,但具体的步骤可能会因操作系统和版本而有所不同。下面我会提供在Windows、macOS和Linux上安装Python的基本步骤。请注意,Python 3和Python 2在安装和配置上有所不同,我这里主要介绍Python 3的安装方法。 Windows系统1. 下载...

铃木swift为什么贵,为何这款小型车如此昂贵?

铃木swift为什么贵,为何这款小型车如此昂贵?

铃木Swift价格较高的原因可以归结为以下几点:1. 研发投入:铃木Swift在设计与研发方面投入了大量资源,确保了车辆的高性能和高质量。例如,第四代车型采用了铃木新一代平台“HEARTECT”,使用了大量高张力钢板,并在细节上进行了轻量化处理,使其具备轻量高刚性的车身结构。2. 高性能动力系统:铃...

go ping,Go语言简介

在Go语言中,实现ping功能有多种方法,包括使用第三方库和手动实现。以下是几种常见的方法: 使用第三方库1. goping库: 简介:goping是一个简洁但功能强大的ICMP回显(ping)库,可以发送和接收ICMP数据包。 安装:使用`go get u github.com/gop...