Dart數據類型

編程語言最基本的特徵之一就是它支持的數據類型。這些是可以用編程語言表示和操作的值的類型。

Dart語言支持以下類型 -

  • 數字
  • 字串
  • 布爾
  • 列表(類似於數組)
  • 集合
  • 映射
  • 符文(用於表示字串中的Unicode字元)
  • 符號

1. 數字類型

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;

2. 字串

字串代表一系列字元。例如,如果要存儲一些數據,如名稱,地址等,則應使用字串數據類型。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';

3. 布爾類型

要表示布爾值,可使用Dart中的bool類型。只有兩個對象具有bool類型:boolean 文字:truefalse,它們都是編譯時常量。

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);

4. 列表類型

幾乎每種編程語言中最常見的集合是數組或有序的對象組。在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還引入了ifcollection的集合,使用它在條件(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');

5. 集合

Dart中的Set是無序的唯一項的集合。Dart支持由Set文字和Set類型提供的集合。下是一個簡單的Dart集,使用set文字創建:

var halogens = {'xuhuhu.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.

6. 映射

通常映射是關聯鍵和值的對象。鍵和值都可以是任何類型的對象。每個鍵只出現一次,但可以多次使用相同的值。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.

7. 符文

在Dart中,符文是字串的UTF-32代碼點。

Unicode為世界上所有書寫系統中使用的每個字母,數字和符號定義唯一的數值。由於Dart字串是UTF-16代碼單元的序列,因此在字串中表示32位Unicode值需要特殊語法。

String類有幾個屬性可用於提取符文資訊。codeUnitAtcodeUnit屬性返回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

8. 符號

Symbol對象表示Dart程式中聲明的運算符或識別字。可能永遠不需要使用符號,但它們對於按名稱引用識別字的API非常有用,因為縮小會更改識別字名稱而不會更改識別字符號。

要獲取識別字的符號,請使用符號文字,它只是#後跟識別字:

#radix
#bar

符號文字是編譯時常量。


上一篇: Dart語言基礎語法 下一篇: Dart變數