Dart基礎以內置類型

簡介

Dart內置有以下類型express

  • numbers
  • strings
  • booleans
  • lists (也稱爲 arrays)
  • sets
  • maps
  • runes(用於字符串中表示 Unicode 字符)
  • symbols

Numbers

int 小於64bits 的整數值。這裏須要注意的是,在Dart VM中支持從 -2^63 到 2^63 - 1,但編譯成JavaScript後的取值範圍爲 -2^53 至 2^53 -1編程

double 64-bit(雙精度)浮點數, 符合IEEE 754 標準數組

intdouble 都是 num 的子類安全

整數是不帶小數點的數字,Demo:app

var x = 1;
var hex = 0xDEADBEEF;
複製代碼

若是有小數點,則是 double, Demo:編程語言

var y = 1.1;
var exponents = 1.42e5;
複製代碼

Dart 2.1中,integer 會在須要的時候自動轉換成 doubles函數

double z = 1; // 至關於 double z = 1.0
複製代碼

須要注意的是:在Dart 2.1以前,上述寫法會有類型轉換錯誤測試

下面教你如何在 string 和 number 之間互相轉換ui

// 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型定義了傳統的位運算操做 shift(<<,>>),AND(&), OR(|),Demo:this

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
複製代碼

numbers是編譯時的常量,許多算術表達式也是編譯時的常量,只要是他們的操做也是編譯時的常量,等同於 numbers, 舉個例子

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
複製代碼

Strings (字符串)

Dart string 是一系列UTF-16代碼單元,你可使用單引號或雙引號來建立字符串:

var s1 = '單引號定義';
var s2 = "雙引號定義";
var s3 = '轉譯符使用\'';
var s4 = "...其餘標點符號定義";
複製代碼

你可使用${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來建立「raw」字符串:

var s = r'In a raw string, not even \n gets special treatment.';
複製代碼

字符串是編譯時常量,只要任何插值表達式是一個編譯時常量,其值爲null或數值,字符串或布爾值。

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a 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';
複製代碼

Booleans

爲了從新定義boolean類型的值,Dart有一個名字叫 bool 的類型。只有兩個對象有bool類型:truefalse,這兩個編譯時常量。 Dart的類型安全(type-safe)意味着你不能使用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);
複製代碼

Lists

也許幾乎每種編程語言中最多見的集合是數組或有序的對象組。 在Dart中,數組是List對象,所以大多數人只是將它們稱爲列表。

Dart列表文字看起來像JavaScript數組文字。 這是一個簡單的Dart列表:

var list = [1, 2, 3];
複製代碼

注意:Dart推斷列表的類型爲List 時,若是嘗試將非整數對象添加到此列表,則分析器或運行時會引起錯誤。

列表使用從零開始的索引,其中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還引入了collection ifcollection for,你可使用它來使用條件(if)和循環(for)來構建集合。

Demo:

//if
var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];

//for
var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');
複製代碼

Sets

Dart中的set是一組無序惟一items的集合。

雖然Set 類型已經成爲Dart核心部分之一,可是 set表達式是在 Dart2.2 中介紹

Demo:

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
複製代碼

注意:Dart會推斷類型Set<String>中的元素,若是添加了一個錯誤的類型到set中,解析器或者運行時會出現錯誤。

建立一個空的set:

var names = <String>{};
// Set<String> names = {}; // 這樣建立也能夠
// var names = {}; // 可是這樣建立的事一個map,而不是set
複製代碼

set中添加item方法:

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
複製代碼

.length獲取set 長度

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
複製代碼

建立一個set 做爲編譯時常量, 在 set 表達式前添加 const

final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.
複製代碼

在 Dart2.3中, sets 支持展開操做符( ......?) 還有集合的 ifs 和 fors, 就和 lists 同樣。

Maps

一般來講, map 是結合了 keys 和 values 的一個對象,keys 和values 均可以做爲一個類型對象。每一個key只能出現一次,可是value能夠出現屢次。 建立一個Demo:

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

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
複製代碼

注意: Dart 會推斷Map中的數據類型,例如:Map<String,String> 和 Map<int,String>, 若是添加錯誤的類型到Map中,解析器或者運行時會報錯。

你可使用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';
複製代碼

也許你會指望用 new Map() 來代替 Map(), 在Dart2中,new 關鍵詞是可選的。

添加一個新的鍵值對到已經存在的map中,就像JavaScript:

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

若是須要查詢的key不在 map 中,就會返回一個 null:

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

.length獲取鍵值對的數量

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

const建立一個編譯時常量map:

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

// constantMap[2] = 'Helium'; // Uncommenting this causes an error.
複製代碼

Dart2.3中,maps支持展開操做符(......?)而且集合 if和 for

Runes(符文)

在Dart中,runes是string 的UTF-32代碼點數

什麼是 UTF-32,點我知道

Unicode爲世界上全部書寫系統中使用的每一個字母,數字和符號定義惟一的數值。 因爲Dart字符串是UTF-16的代碼單元序列,所以在字符串中表示32位Unicode值須要特殊語法。

什麼是 UTF-16,點我知道

因此Runes是爲了補充 Dart String中不支持的UTF-32而存在的。

表達Unicode代碼點的經常使用方法是\uXXXX,其中XXXX是4位十六進制值。 例如,愛心符號(♥)是\u2665。 要指定多於或少於4個十六進制數字,請將值放在大括號中。 例如,笑的表情符號(😆)是\u{1f600}

String類有幾個屬性可用於提取rune信息。 codeUnitAtcodeUnit屬性返回16位代碼單元。 使用runes屬性獲取字符串的rune。

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

//輸出
//👏
//[55357, 56399]
//[128079]
//♥ 😅 😎 👻 🖖 👍

複製代碼

Symbols(符號)

Symbol對象表明在Dart程序中聲明的運算符或標識符。

你可能永遠不須要使用符號,可是它們對於按名稱引用標識符的API來講是無價之寶,由於最小化會更改標識符名稱,但不會更改標識符符號。

要獲取標識符的符號,請使用符號文字,該符號文字是,後跟標識符:

#radix
#bar
複製代碼

符號表達式是編譯時的常量

相關文章
相關標籤/搜索