带你Dart带你Diao之重要概念

核心内容
  • 最基础的Dart程序
  • Dart一些重要的概念
  • KeyWord(关键字)
  • Variable(变量)
  • Final&&Const
  • Dart的内置类型

最基础的Dart程序

先看一个最基础的Dart程序

void log(Object object) {
  print(object.toString());
}

/// Returns a Boolean representation for [arg], which must
/// be a String or bool.
bool convertToBool(dynamic arg) {
  if (arg is bool) return arg;
  if (arg is String) return arg == 'true';
  throw ArgumentError('Cannot convert $arg to a bool.');
}

上面的代码写出了Dart最基本的一些特性。

以下的东西基本会出现在所有的Dart程序中

int
一种类型。其他一些内建类型还有是Sting, list,和bool等

42
数字,一个编译时的常数.

print()
显示输出的print方法。

‘…'(或”…”)
字符串文本

$variableName或${表达方式}

字符串插值:在字符串文本中包含一个变量或表达式的字符串等效的字符串。

main()
应用程序执行开始的顶级方法

var
一种在不指定变量类型的情况下声明变量的方法。

Dart一些重要的概念

(1)与Java不同,Dart没有公开、受保护和私有的关键字。如果标识符以下划线(_)开头,则它对其库是私有的。

(2)标识符可以字母或下划线(_)开头,后面跟着这些字符的任何组合加上数字

(3)DART工具可以报告两种问题:警告和错误。警告只是表明您的代码可能无法工作,但它们并不妨碍您的程序执行。错误可以是编译时,也可以是运行时。编译时错误完全阻止代码执行;运行时错误导致在执行代码时引发异常。

(4)DART有表达式(有运行时值)和语句(没有)。例如,条件表达式条件?expr1:expr2的值为expr1或expr2。将其与没有值的if-etc语句进行比较。语句通常包含一个或多个表达式,但表达式不能直接包含语句。

(5)虽然DART是强类型的,但类型注释是可选的,因为DART可以推断类型。在上面的代码中,number推断为类型INT。当您想明确表示不需要任何类型时,使用特殊类型dynamic.

(6)DAT支持泛型类型,如List<int>(整数列表)或List<dynamic>(任何类型的物体的清单)。

(7)DART支持顶级函数(如main()),以及绑定到类或对象的函数(静态和实例方法分别)。您还可以在函数中创建函数(巢式或局部函数).

‘…'(或”…”)表示字符串文字

KeyWord(关键字)

避免使用这些词作为标识符。但是,如果有必要,标记上标的关键字可以是标识符,但是表中的其他单词是保留字不能作为是标识符

《带你Dart带你Diao之重要概念》 keyword.png

  1. 上标词1是语境关键词,只有在特定的地方才有意义。到处都是有效的标识符。
  2. 上标词2是内置标识符。为了简化将JavaScript代码移植到DART的任务,这些关键字在大多数地方都是有效的标识符,但它们不能用作类名或类型名称,也不能用作导入前缀。
  3. 上标词3是与异步支持这是在Dart的1.0版本之后添加的。你不能用await或yield作为标识符,在任何被标记为async, async,或sync.

Variable(变量)

创建变量有三种方式

String name = 'Bob';
var name = 'Bob';
dynamic name = 'Bob';

(1)String很简单,就是显式声明变量类型是String类型

(2)var表示name变量可以根据值(’Bob’)从而推断出它的类型(String)

(3)如果对象不限于单个类型,就使用dynamic关键字,指定对象为dynamic类型

对于局部变量,这里按代码风格推荐部分的建议,使用 var 而不是具体的类型来定义局部变量

变量的默认值

比如语句:
int a;

那么它的默认值就是null,并不是0。
int类型的变量和Dart中的其他所有一切都是对象

Final&&Const

Final变量必须要给个初始值,并且给定后,就不能再次赋值给该变量

final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';

再次赋值会报错

name = 'Alice'; // Error: a final variable can only be set once.

Const变量是编译时常量.(Const变量是隐式最终变量。)第一次使用时,将初始化最后一个顶级变量或类变量。
如果const变量位于类级别,则标记它为static const

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

不仅用于声明常量变量。您也可以使用它来创建常量值,以及声明构造函数创造常数值任何变量都可以有一个常量值。

var foo = const [];
final bar = const [];
const baz = []; // 等同于const [] 

注意:可以省略常量的初始化表达式常量声明

可以改变不是final、const修饰的变量,即使它被赋值过const常量

例如修改上述的var foo

foo = [1, 2, 3]; // Was const []

不能改变一个const常量的值,例如修改上述的const baz,就会报错

baz = [42]; // Error: Constant variables can't be assigned a value.

内置类型

DART语言支持以下数据类型

  1. numbers
  2. strings
  3. booleans
  4. lists (also known as arrays)
  5. maps
  6. runes (for expressing Unicode characters in a string)
  7. symbols
(一)numbers

Dart的numbers有两种形式

一个是int,它的整数值不大于64位,具体范围取决于平台。在dart vm上,值可以是
-2^63 至 2^63-1 。编译为JavaScript的DART使用JavaScript数字允许-2^53 至2^53-1

另一个是double。64位双精度浮点数,由IEEE 754标准指定

int和double支持基本的加减乘除运算,也可以找到abs()、ceil()和floor()其他方法。如果一些方法在int和double类里面没有找到,那么在dart::math库里面或许可以找到

int x = 1;
int hex = 0xDEADBEEF;

double y = 1.1;
double exponents = 1.42e5;

字符串转数字的方法

// 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');
(二)String

DART字符串是一个UTF-16码单元的序列.可以使用单引号或双引号创建字符串:

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";

可以将表达式的值放入字符串中,方法是${表达}。如果表达式是标识符,则可以跳过{}。要获取与对象对应的字符串,DAT调用对象的字符串toString()方法。

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, ' +
        'which is very handy.');
        
assert('That deserves all caps. ' +
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. ' +
        'STRING INTERPOLATION is very handy!');

==操作符表示判断两个对象是否相等

相邻的多个字符串会自动拼成一个字符串,或者使用”+”拼装

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";
assert(s1 ==
    'String concatenation works even over '
    'line breaks.');

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

注意:文字字符串要求是编译时常量,只要任何内插表达式是编译时常量,比如说结果是为NULL或数值或字符串或布尔值。

//这些是可以内嵌到字符串中的
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// 这些不能内嵌到字符串中
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];


const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';

提供一个 r 前缀可以创建一个 “原始 raw” 字符串

var s = r"In a raw string, even \n isn't special.";  //加上r 可以防止\n换行

使用三个单引号或者双引号也可以 创建多行字符串对象


var s1 = '''a
You can create
multi-line strings like this one.
''';
输出s1结果是
a
You can create
multi-line strings like this one.
(三)Booleans

为了表达布尔值,Dart把类型命名为bool,有两种类型值,true和false,他们都是编译时常量。

当 Dart 需要一个布尔值的时候,只有 true 对象才被认为是 true。 所有其他的值都是 false。这点和 JavaScript 不一样, 像 1、 “aString”、 以及 someObject 等值都被认为是 false。

例如

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

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

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

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

var name = 'Bob';
if (name) {  //name被转换成bool类型,默认是false
  // Prints in JavaScript, not in Dart.
  print('You have a name!');
}

如果在 JavaScript 中运行,则会打印出 “You have a name!”,在 JavaScript 中 name 是非 null 对象所以认为是 true。但是在 Dart 的生产模式下 运行,这不会打印任何内容,原因是 name 被转换为 false了,原因在于 name != true。 如果在 Dart 检查模式运行,上面的 代码将会抛出一个异常,表示 name 变量不是一个布尔值。

(四)List

大多数编程语言中的集合都是数据或者对象组。在dart里面数组就是list对象

Dart list就像JavaScript数组文本。下面是Dart的一个简单list

var list = [1, 2, 3];

分析器推断list有型List<int>。如果尝试向此列表添加非整数对象,分析器或运行时将引发错误。list的索引从0开始,即0是第一个元素的索引

list[1] = 1;
assert(list[1] == 1);

List类型支持很多操作list的方法,不可以像数组赋值那样直接对元素赋值

var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
(五)Map

可以使用Map构造方法创建对象

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

我们发现没有new Map(),在Dart 2里new关键字是可选的。

向现有的映射中添加元素

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

从映射中查询值

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

要获取映射中键值对的数目,使用.length

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

获取键值对的值

//Map的用法
final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};


print(constantMap[11]);  //打印为null
print(constantMap[10]);  //打印 neon
print(constantMap.length);  //打印 3
(六)Runes

在DART中,runes表示字符串的UTF-32编码

Unicode为所有世界上的书写系统中使用的每个字母、数字和符号定义一个唯一的数字值。由于DART字符串是由UTF-16代码单元组成的序列,因此在字符串中表示32位Unicode值需要特殊的语法。
通常表示Unicode代码点的方法是\uXXXX,其中XXXX是一个4位的十六进制值。例如,爱心字符(♥)是\u2665。

String类具有几个可用于提取符文信息的属性,codeUnitAt和codeUnit属性返回16位代码单元。使用runes属性获取字符串的符文。

例如

main() {
  var clapping = '\u{1f44f}';
  print(clapping);
  print(clapping.codeUnits);
  print(clapping.runes.toList());
 
  Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
}

运行结果是这样

《带你Dart带你Diao之重要概念》 runes.png

(七)Symbols

Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。要获取标识符的符号,请使用符号文字,它只是#后跟标识符:

#radix
#bar

这个很不常用,就暂时忽略吧…..

这里的很多内容都只是大概介绍个基础点,里面的每个部分都还有很多知识点细节需要学习,在之后的系列会慢慢展开来说。

漫漫人生路,偶尔还是要喝点有营养的鸡汤的

人生都是走着走着就开阔了,现在的你,不用着急。让未来的,本该属于你的树再长长,那些花再开开,等你遇见的时候,才是他们最美的时候。

    原文作者:树獭非懒
    原文地址: https://www.jianshu.com/p/d889ab8065d2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞