內(nèi)建類型(下)

2020-02-03 23:51 更新

Map

通常來說, Map 是用來關(guān)聯(lián) keys 和 values 的對象。 keys 和 values 可以是任何類型的對象。在一個 Map 對象中一個 key 只能出現(xiàn)一次。 但是 value 可以出現(xiàn)多次。 Dart 中 Map 通過 Map 字面量 和 Map 類型來實現(xiàn)。

下面是使用 Map 字面量的兩個簡單例子:

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

提示: Dart 會將 gifts 的類型推斷為 Map<String, String>, nobleGases 的類型推斷為 Map<int, String> 。 如果嘗試在上面的 map 中添加錯誤類型,那么分析器或者運行時會引發(fā)錯誤。 有關(guān)更多信息,請閱讀類型推斷。。

以上 Map 對象也可以使用 Map 構(gòu)造函數(shù)創(chuàng)建:

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

提示: 這里為什么只有 Map() ,而不是使用 new Map()。 因為在 Dart 2 中,new 關(guān)鍵字是可選的。 有關(guān)更多信息,參考 構(gòu)造函數(shù)的使用。

類似 JavaScript ,添加 key-value 對到已有的 Map 中:

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

類似 JavaScript ,從一個 Map 中獲取一個 value:

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

如果 Map 中不包含所要查找的 key,那么 Map 返回 null:

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

使用 .length 函數(shù)獲取當前 Map 中的 key-value 對數(shù)量:

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

創(chuàng)建 Map 類型運行時常量,要在 Map 字面量前加上關(guān)鍵字 const。

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // 取消注釋會引起錯誤。

更名多關(guān)于 Map 的內(nèi)容,參考 Generics and Maps.


Rune

在 Dart 中, Rune 用來表示字符串中的 UTF-32 編碼字符。

Unicode 定義了一個全球的書寫系統(tǒng)編碼, 系統(tǒng)中使用的所有字母,數(shù)字和符號都對應(yīng)唯一的數(shù)值編碼。 由于 Dart 字符串是一系列 UTF-16 編碼單元, 因此要在字符串中表示32位 Unicode 值需要特殊語法支持。

表示 Unicode 編碼的常用方法是, \uXXXX, 這里 XXXX 是一個4位的16進制數(shù)。 例如,心形符號 (?) 是 \u2665。 對于特殊的非 4 個數(shù)值的情況, 把編碼值放到大括號中即可。 例如,emoji 的笑臉 (?) 是 \u{1f600}。

String 類有一些屬性可以獲得 rune 數(shù)據(jù)。 屬性 codeUnitAt 和 codeUnit 返回16位編碼數(shù)據(jù)。 屬性 runes 獲取字符串中的 Rune 。

下面是示例演示了 Rune 、 16-bit code units、 和 32-bit code points 之間的關(guān)系。

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


Symbol

一個 Symbol 對象表示 Dart 程序中聲明的運算符或者標識符。 你也許永遠都不需要使用 Symbol ,但要按名稱引用標識符的 API 時, Symbol 就非常有用了。 因為代碼壓縮后會改變標識符的名稱,但不會改變標識符的符號。 通過字面量 Symbol ,也就是標識符前面添加一個 # 號,來獲取標識符的 Symbol 。

#radix
#bar

Symbol 字面量是編譯時常量。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號