Skip to main content

dart之Type & Operator

· 预计阅读5分钟

headerimg

我们再来看看dart的类型和操作符。

内置类型

number类型

Dart 支持两种 Number 类型:

  • int
  • double

Strings

包含的是 UTF-16 编码的字符序列。所以length是UTF-16的个数,可能和我们的可视化字符数并不一致

void main() {
var person = "你😁";
print("${person.length}");// 3
}

下面是创建字符串的方式:

void main() {
var str1 = "hello world"; //双引号
var str2 = 'hello world'; //单引号
var str3 = '''hello world
hello world
'''; // 创建多行文本
var str4 = r'hello \n world'; // 原始字符串,不处理转义
var str5 = r"hello \n world"; // 原始字符串,不处理转义
print(str1);
print(str2);
print(str3);
print(str4);
print(str5);
}

字符串插值

var age = 123;
var str = "age is $age";
var str1 = "age is ${age + 1}";//dart推荐风格是变量不加{}, 表达式加{}

bool类型

true和false。Dart 的类型安全不允许你使用类似 if (nonbooleanValue) 或者 assert (nonbooleanValue) 这样的代码检查布尔值。我们应该总是显示地检查布尔值,比如像下面的代码这样:

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

if(3) {// error,

}

Lists

数组,对应其他语言中的Array。

var list1 = [1, 2, 3];//字面量
var lsit2 = List.filled(10, 34);//方法

字面量中还可以用spread操作符

var list = [1,2,3]
var list2 = [4,5,...list];
var lsit3 = [4, 5, 6, ...?list1];

字面量中还可以使用if和for

var age = 100;
var list = [1, 2, 3, if (age > 50) 99];
var list1 = [1, 2, 3, for (var i in list) i];
print(list);
print(list1);

Sets

初始化

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
halogens.add('fluorine11');

同List,也支持spread操作符,if,for。

Maps

其他语言中的Dictionary。

var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};

var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};

同List,也支持spread操作符,if,for。

Runes and grapheme clusters

之前说过String是UTF-16字符串。所以我们在判断字符时就不能直接操作原始字符串了。我们可以通过characters来获取unicode字符。注意导入对应的包。

import 'package:characters/characters.dart';

void main() {
var str = "笑😁";
print("${str.characters.length}");
}

Symbols

以#开头,是编译时常量。

操作符

和其他语言基本差不多

DescriptionOperator
unary postfixexpr++ expr-- () [] ?[] . ?. !
unary prefix-expr !expr ~expr ++expr --expr await expr
multiplicative* / % ~/
additive+ -
shift<< >> >>>
bitwise AND&
bitwise XOR^
bitwise OR`
relational and type test>= > <= < as is is!
equality== !=
logical AND&&
logical OR`
if null??
conditionalexpr1 ? expr2 : expr3
cascade.. ?..
assignment= *= /= += -= &= ^= etc.

注意除法 5 / 2 = 2.5 ,不是其他语言中的整数。5 ~/ 2 = 2,这个才是结果取整数。

cascade是dart特有的操作符:

var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
等价于
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
//如果可能为null,那么可以使用?..
var button = querySelector('#confirm') // Get an object.
?..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
等价于
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));