寫(xiě)在前面
本文基本上是將dart官網(wǎng)部分內(nèi)容進(jìn)行翻譯丘跌,沒(méi)興趣的請(qǐng)出門(mén)左轉(zhuǎn)至Dart的官網(wǎng),有興趣的同志請(qǐng)繼續(xù)閱讀本文初烘。
Flutter教程在這里
數(shù)字
Dart的數(shù)字一共分為2類:
-
int
整型不大于64位罢缸,具體取決于平臺(tái)。 在Dart VM上颊艳,值可以是-263到263 - 1.編譯為JavaScript的Dart使用JavaScript 數(shù)字茅特,允許從-253到253 - 1的值。 -
double
64位(雙精度)浮點(diǎn)數(shù)棋枕,由IEEE 754標(biāo)準(zhǔn)規(guī)定白修。
int
和double都是num
的子類型。 num
類型包括基本運(yùn)算符重斑,如+兵睛, - ,/和*,也是你可以找到abs()
祖很,ceil()
和floor()
以及其他方法的地方。 (按位運(yùn)算符,如>>
,在int
類中有定義趟脂。)如果num及其子類沒(méi)有您要想要內(nèi)容,那dart:math庫(kù)可能有您想要的累澡。
整數(shù)是沒(méi)有小數(shù)點(diǎn)的數(shù)字哼蛆。 以下是定義整數(shù)文字的一些示例:
int x = 1;
int hex = 0xDEADBEEF;
如果數(shù)字包含小數(shù),則為雙精度數(shù)。 以下是定義雙精度數(shù)字的一些示例:
double y = 1.1;
double exponents = 1.42e5;
以下是將字符串轉(zhuǎn)換為數(shù)字的方法名挥,反之亦然:
// 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
類型指定傳統(tǒng)的按位移位(<<救湖,>>),AND(&)和OR(|)運(yùn)算符陡舅。 例如:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
文字?jǐn)?shù)字是編譯時(shí)常量。 許多算術(shù)表達(dá)式也是編譯時(shí)常量颅眶,只要它們的操作數(shù)是編譯為數(shù)字的編譯時(shí)常量蜈出。(注:這是說(shuō)如果一個(gè)表達(dá)式涉及到的變量也是編譯時(shí)常量,那么表達(dá)式也是編譯時(shí)常量涛酗。)
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
字符串
Dart字符串是一系列UTF-16代碼單元铡原。 您可以使用單引號(hào)或雙引號(hào)來(lái)創(chuàng)建字符串:
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.";
您可以使用${expression}
將表達(dá)式的值放在字符串中。 如果表達(dá)式是標(biāo)識(shí)符煤杀,則可以跳過(guò){}眷蜈。 要獲取對(duì)應(yīng)于對(duì)象的字符串,Dart調(diào)用對(duì)象的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!');
注意:==運(yùn)算符測(cè)試兩個(gè)對(duì)象是否相同酌儒。 如果兩個(gè)字符串包含相同的代碼單元序列,則它們是等效的枯途。
您可以使用相鄰的字符串文字或+運(yùn)算符來(lái)連接字符串:
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.');
創(chuàng)建多行字符串的另一種方法:使用帶有單引號(hào)或雙引號(hào)的三重引號(hào):
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
您可以通過(guò)在其前面加上r來(lái)創(chuàng)建“raw”字符串:
var s = r'In a raw string, not even \n gets special treatment.';
有關(guān)如何在字符串中表示Unicode字符的詳細(xì)信息忌怎,請(qǐng)參閱Runes。
文字字符串是編譯時(shí)常量酪夷,只要任何插值表達(dá)式是一個(gè)編譯時(shí)常量榴啸,其值為null或數(shù)值,字符串或布爾值晚岭。
// 這些在const String可以使用.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// 這些在const 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';
有關(guān)使用字符串的更多信息鸥印,請(qǐng)參閱字符串和正則表達(dá)式。
布爾值
為了表示布爾值,Dart有一個(gè)名為bool
的類型库说。 只有兩個(gè)對(duì)象具有bool
類型: true
和false
狂鞋,它們都是編譯時(shí)常量。
Dart的類型安全意味著您不能使用if(nonbooleanValue)
或assert(nonbooleanValue)
等代碼潜的。 相反骚揍,明確檢查值,如下所示:
// 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);
列表
也許幾乎每種編程語(yǔ)言中最常見(jiàn)的集合是數(shù)組或有序的對(duì)象組啰挪。 在Dart中信不,數(shù)組是List 對(duì)象,因此大多數(shù)人只是將它們稱為列表亡呵。
Dart列表文字看起來(lái)像JavaScript
數(shù)組文字抽活。 這是一個(gè)簡(jiǎn)單的Dart List:
var list = [1, 2, 3];
注意:分析器推斷列表的類型為L(zhǎng)ist <int>。 如果嘗試將非整數(shù)對(duì)象添加到此列表政己,則分析器或運(yùn)行時(shí)會(huì)引發(fā)錯(cuò)誤酌壕。 有關(guān)更多信息,請(qǐng)閱讀類型推斷歇由。
List使用從零開(kāi)始的索引卵牍,其中0是第一個(gè)元素的索引,list.length - 1
是最后一個(gè)元素的索引沦泌。 您可以像在JavaScript
中一樣獲取列表的長(zhǎng)度并引用列表元素:
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
要?jiǎng)?chuàng)建一個(gè)編譯時(shí)常量的列表糊昙,請(qǐng)?jiān)诹斜砦淖种疤砑?code>const:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // 取消注釋會(huì)導(dǎo)致錯(cuò)誤。
List類型有許多方便的方法來(lái)操作列表谢谦。 有關(guān)列表的更多信息释牺,請(qǐng)參閱泛型和集合。
映射
通常回挽,映射是一個(gè)有鍵和值的對(duì)象没咙。 鍵和值都可以是任何類型的對(duì)象。 每個(gè)鍵只出現(xiàn)一次千劈,但您可以多次使用相同的值祭刚。 Dart的Map支持由映射文字和Map。
這里有幾個(gè)簡(jiǎn)單的Dart映射墙牌,使用map文字創(chuàng)建:
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
注意:分析器推斷
gifts
的類型為Map <String涡驮,String>
,而nobleGases
的類型為Map <int喜滨,String>捉捅。 如果您嘗試將錯(cuò)誤類型的值添加到任一映射,則分析器或運(yùn)行時(shí)會(huì)引發(fā)錯(cuò)誤虽风。 有關(guān)更多信息棒口,請(qǐng)閱讀類型推斷寄月。
您可以使用Map構(gòu)造函數(shù)創(chuàng)建相同的對(duì)象:
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
注意:您可能希望看到
new Map()
而不僅僅是Map()
。 從Dart 2開(kāi)始无牵,new
關(guān)鍵字是可選的剥懒。 有關(guān)詳細(xì)信息,請(qǐng)參閱使用構(gòu)造函數(shù)合敦。
像在JavaScript
中一樣,將新的鍵值對(duì)添加到現(xiàn)有Map:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // 新增一個(gè)鍵值對(duì)
以與在JavaScript中相同的方式從Map中檢索值:
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
如果您在Map中查找一個(gè)不存的鍵验游,則會(huì)返回null
:
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
使用.length
獲取Map
中鍵值對(duì)的數(shù)量:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
要?jiǎng)?chuàng)建一個(gè)為編譯時(shí)常量的Map充岛,請(qǐng)?jiān)趍ap之前添加const
:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
// constantMap[2] = 'Helium'; // 取消注釋會(huì)導(dǎo)致錯(cuò)誤。