模式切换
类型
Dart 是一种强类型语言,具有灵活的类型系统。
基本类型
Dart 提供了多种内置类型,用于处理常见的数据和功能。
常见内置类型
数值类型
int
:表示整数。double
:表示浮点数。
dart
int age = 30;
double price = 19.99;
字符串类型
String
:用于表示文本。
dart
String name = 'Dart';
布尔类型
bool
:值为true
或false
。
dart
bool isActive = true;
空类型
Null
:表示没有值,常用于表示空状态。void
:表示函数没有返回值。
dart
void sayHello() {
print('Hello');
}
动态类型
- dynamic
dynamic
是一种特殊类型,它禁用静态类型检查。当你将一个变量声明为动态变量时,你可以给它赋任何类型的值,编译器不会检查类型错误。
它允许更大的灵活性,但牺牲了类型安全性。这意味着使用 dynamic
时,类型检查是在运行时进行的。如果你在编译时没有捕获到类型错误,这些错误可能会在运行时抛出。
- Object
Object
是 Dart 中所有对象的基类,它是所有 Dart 类的超类。Object
类型的变量可以存储任何类型的值。
使用 Object
类型时,类型检查会更加严格。例如,如果你将一个 String
赋值给一个 Object
类型的变量,但试图将其作为 int
使用,会在运行时抛出异常。
dart
void exampleWithObject() {
Object obj = 'Hello, World!';
// obj = 123; // 编译时不会报错,但如果你试图将其作为 int 使用,会运行时报错
}
void exampleWithDynamic() {
dynamic dyn = 'Hello, World!';
dyn = 123; // 编译时不会报错,运行时也不会报错
}
void main() {
exampleWithObject();
exampleWithDynamic();
}
记录
记录是一种轻量级的数据结构,用于存储一组字段,类似于 Python 中的元组。
要求 Dart 版本至少为 3.0。
定义记录
- 使用圆括号
()
定义记录。 - 字段可以是位置字段或命名字段。
dart
var record1 = (10, 'Dart'); // 位置字段
var record2 = (name: 'Alice', age: 25); // 命名字段
访问记录字段
- 使用
.$n
访问位置字段。 - 使用
.fieldName
访问命名字段。
dart
print(record1.$1); // 输出: 10
print(record2.name); // 输出: Alice
解构赋值
记录支持解构赋值:
dart
var (id, language) = record1;
print(id); // 输出: 10
集合
Dart 提供三种主要的集合类型:List
、Set
和 Map
。
列表
- 用于存储有序元素集合。
- 支持固定长度和动态长度两种形式。
dart
List<int> numbers = [1, 2, 3];
numbers.add(4); // 添加元素
print(numbers[0]); // 访问第一个元素
集合
- 用于存储唯一元素的集合。
dart
Set<String> names = {'Alice', 'Bob', 'Alice'}; // 自动去重
print(names); // 输出: {Alice, Bob}
映射
- 键值对集合。
dart
Map<String, int> scores = {'Alice': 90, 'Bob': 80};
print(scores['Alice']); // 输出: 90
泛型
泛型允许在类、方法或集合中使用占位类型,以提高代码的灵活性和类型安全性。
泛型类
dart
class Box<T> {
T value;
Box(this.value);
}
void main() {
var intBox = Box<int>(42);
print(intBox.value); // 输出: 42
}
泛型方法
dart
T getFirst<T>(List<T> items) {
return items.first;
}
void main() {
print(getFirst<int>([1, 2, 3])); // 输出: 1
}
别名
typedef
用于定义函数类型的别名或更具可读性的类型名称。
函数类型别名
dart
typedef IntOperation = int Function(int a, int b);
int add(int a, int b) => a + b;
void main() {
IntOperation operation = add;
print(operation(2, 3)); // 输出: 5
}
泛型别名
dart
typedef ItemProcessor<T> = T Function(T item);
T processItem<T>(T item, ItemProcessor<T> processor) {
return processor(item);
}
void main() {
print(processItem<int>(5, (item) => item * 2)); // 输出: 10
}
类型系统
Dart 使用强类型和静态类型检查的类型系统,支持空安全和类型推断。
空安全
- 默认情况下,变量不能为
null
。 - 如果需要允许
null
,使用?
表示可空类型。
dart
int? age = null;
fun?.call(); // 如果 fun 不为 null,则调用
- 使用
!
断言操作符表示非空断言。即一个变量你可以确定它不为空,但编译器无法确定时,可以使用!
断言操作符。
dart
int? age = 0;
int newAge = age!; // 断言 age 不为空
类型检查和转换
- 类型检查:使用
is
。 - 类型转换:使用
as
。
dart
Object value = 'Hello';
if (value is String) {
print(value.length); // 类型检查后可以访问 String 的属性
}
类型推断
- 使用
var
和final
自动推断类型。
dart
var number = 42; // 推断为 int
final name = 'Dart'; // 推断为 String