程式設計語言最基本的特徵之一就是它支援的資料型別。這些是可以用程式設計語言表示和操作的值的型別。
Dart語言支援以下型別 -
Dart中的數位型別用於表示數位文字。Dart中的數位型別有兩種型別 -
整數 - 整數值表示非小數值,即沒有小數點的數值。例如,10
是整數。使用int
關鍵字表示整數文字。
雙精度數 - Dart還支援小數數值,即帶小數點的值。Dart中的Double資料型別表示64位元(雙精度)浮點數。例如,10.10
。關鍵字double
用於表示浮點文字。
整數是沒有小數點的數位。以下是定義整數文字的一些範例:
var x = 123;
var hex = 0xDEADBEEF;
如果數位包含小數,則為雙精度數。以下是定義雙精度數文字的一些範例:
var y = 1.199;
var exponents = 1.42e5;
從Dart 2.1開始,必要時整數文字會自動轉換為雙精度數:
double z = 10; // 相當於 double z = 10.0.
以下是將字串轉換為數位的方法,反之亦然:
// 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
型別指定傳統的按位元移位(<<
,>>
),AND(&
)和OR(|
)運算子。例如:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
文字數位是編譯時常數。許多算術表示式也是編譯時常數,只要它們的運算元是編譯為數位的編譯時常數。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
字串代表一系列字元。例如,如果要儲存一些資料,如名稱,地址等,則應使用字串資料型別。Dart字串是一系列UTF-16
程式碼單元。符文用於表示UTF-32
程式碼單元序列。
關鍵字String
用於表示字串文字,字串值嵌入單引號或雙引號中。因此可以使用單引號或雙引號來建立字串:
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}
將表示式的值放在字串中。如果表示式是識別符號,則可以跳過{}
。為了獲得對應於物件的字串,Dart呼叫物件的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.');
使用帶有單引號或雙引號的三引號建立多行字串:
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
可以通過在前面加上r
來建立「原始」字串:
var s = r'In a raw string, not even \n gets special treatment.';
文字字串是編譯時常數,只要任何插值表示式是一個編譯時常數,其值為null
或數值,字串或布林值都可以。
// 在 const 字串中。
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// 不在 const 字串中。
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';
要表示布林值,可使用Dart中的bool
型別。只有兩個物件具有bool型別:boolean 文字:true
和false
,它們都是編譯時常數。
Dart的型別安全不能使用if(nonbooleanValue)
或assert(nonbooleanValue)
之類的程式碼。需要明確檢查值,如下所示:
// 檢查空字串。
var fullName = '';
assert(fullName.isEmpty);
// 檢查零值。
var hitPoints = 0;
assert(hitPoints <= 0);
// 檢查是否為null。
var unicorn;
assert(unicorn == null);
// 檢查NaN。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
幾乎每種程式設計語言中最常見的集合是陣列或有序的物件組。在Dart中,陣列是List
物件,因此大多數人將它稱為列表。
Dart列表文字看起來像JavaScript陣列文字。下面是一個簡單的Dart列表:
var list = [1, 2, 3];
列表使用從0
開始的索引,其中0
是第一個元素的索引,list.length-1
是最後一個元素的索引。可以獲得列表的長度並像在JavaScript中一樣參照列表元素:
var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
要建立一個編譯時常數的列表,請在列表文字之前新增const
:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
Dart 2.3引入了擴充套件運算子(...
)和空值感知擴充套件運算子(...?
),它提供了一種將多個元素插入集合的簡潔方法。
例如,使用擴充套件運算子(...
)將列表的所有元素插入另一個列表:
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);
如果擴充套件運算子右側的表示式可能為null
,則可以通過使用支援null
的擴充套件運算子(...?
)來避免異常:
var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
Dart 2.3還引入了if
和collection
的集合,使用它在條件(if
)和重複(for
)構建集合。
下面是一個使用集合的範例,如果要建立一個包含三個或四個專案的列表:
var nav = [
'Home',
'Furniture',
'Plants',
if (promoActive) 'Outlet'
];
這是一個使用集合來操作列表專案,然後將它們新增到另一個列表之前的範例:
var listOfInts = [1, 2, 3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');
Dart中的Set是無序的唯一項的集合。Dart支援由Set文字和Set型別提供的集合。下是一個簡單的Dart集,使用set文字建立:
var halogens = {'tw511.com', 'chlorine', 'bromine', 'iodine', 'astatine'};
要建立一個空集合,請使用前面帶有型別引數的{}
,或者將{}
賦給型別為Set
的變數:
var names = <String>{};
Set<String> names = {}; // This works, too.
//var names = {}; // Creates a map, not a set.
使用add()
或addAll()
方法將項新增到現有集合:
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
使用.length
來獲取集合中的專案數量:
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
要建立一個編譯時常數的集合,請在set文字之前新增const
:
final constantSet = const {
'fluorine',
'chlorine',
'bromine',
'iodine',
'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.
通常對映是關聯鍵和值的物件。鍵和值都可以是任何型別的物件。每個鍵只出現一次,但可以多次使用相同的值。Dart支援由對映文字和Map型別提供的對映。
下面是幾個簡單的Dart對映,使用對映文字建立:
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
可以使用Map建構函式建立相同的物件:
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';
像在JavaScript中一樣,將新的鍵值對新增到現有對映:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
以與在JavaScript中相同的方式從對映中檢索值:
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
如果查詢不在對映中的鍵,則將返回null
:
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
使用.length
來獲取對映中鍵值對的數量:
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
要建立一個編譯時常數的對映,請在map文字之前新增const
關鍵字:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
// constantMap[2] = 'Helium'; // Uncommenting this causes an error.
在Dart中,符文是字串的UTF-32程式碼點。
Unicode為世界上所有書寫系統中使用的每個字母,數位和符號定義唯一的數值。由於Dart字串是UTF-16
程式碼單元的序列,因此在字串中表示32位元Unicode值需要特殊語法。
String
類有幾個屬性可用於提取符文資訊。codeUnitAt
和codeUnit
屬性返回16位元程式碼單元。使用runes
屬性獲取字串的符文。
以下範例說明了符文,16位元程式碼單元和32位元程式碼點之間的關係。
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
Symbol
物件表示Dart程式中宣告的運算子或識別符號。可能永遠不需要使用符號,但它們對於按名稱參照識別符號的API非常有用,因為縮小會更改識別符號名稱而不會更改識別符號符號。
要獲取識別符號的符號,請使用符號文字,它只是#
後跟識別符號:
#radix
#bar
符號文字是編譯時常數。