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

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

符號文字是編譯時常數。