目錄

Dart 語言特別支援下列內容

此支援包含使用字面值建立物件的能力。例如,'this is a string' 是字串字面值,而 true 是布林字面值。

由於 Dart 中的每個變數都參照物件(類別的執行個體),因此通常可以使用建構函式來初始化變數。一些內建類型有自己的建構函式。例如,可以使用 Map() 建構函式來建立映射。

其他一些類型在 Dart 語言中也扮演特殊角色

  • Object:所有 Dart 類別的超類別,除了 Null
  • Enum:所有列舉的超類別。
  • FutureStream:用於 非同步支援
  • Iterable:用於 for-in 迴圈 和同步 產生器函式
  • Never:表示表達式永遠無法成功完成評估。最常使用於總是擲回例外狀況的函式。
  • dynamic:表示您想要停用靜態檢查。通常您應該改用 ObjectObject?
  • void:表示值從未被使用。通常用作回傳類型。

ObjectObject?NullNever 類別在類別階層中扮演特殊角色。在 了解 Null 安全性 中了解這些角色。

數字

#

Dart 數字有兩種形式

int
整數值不超過 64 位元,取決於平台。在原生平台上,值可以從 -263 到 263 - 1。在網路中,整數值表示為 JavaScript 數字(沒有小數部分的 64 位元浮點值),可以從 -253 到 253 - 1。
double
64 位元(雙精度)浮點數,如 IEEE 754 標準所指定。

intdouble 都是 num 的子類型。num 類型包含基本運算子,例如 +, -, / 和 *,您還可以在其中找到 abs()ceil()floor() 等方法。(位元運算子,例如 >>,在 int 類別中定義。)如果 num 及其子類型沒有您要尋找的內容,dart:math 函式庫可能會有。

整數是沒有小數點的數字。以下是定義整數字面值的一些範例

dart
var x = 1;
var hex = 0xDEADBEEF;

如果數字包含小數,則為 double。以下是定義 double 字面值的一些範例

dart
var y = 1.1;
var exponents = 1.42e5;

您也可以將變數宣告為 num。如果您這樣做,則變數可以同時具有整數和 double 值。

dart
num x = 1; // x can have both int and double values
x += 2.5;

必要時,整數文字會自動轉換為雙精度浮點數

dart
double z = 1; // Equivalent to double z = 1.0.

以下是如何將字串轉換為數字,反之亦然

dart
// 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 (|) 和 XOR (^) 運算子,這些運算子對於在位元欄位中操作和遮罩標記很有用。例如

dart
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000

有關更多範例,請參閱 位元運算和位移運算子 部分。

文字數字是編譯時期常數。許多算術表達式也是編譯時期常數,只要它們的運算元是會評估為數字的編譯時期常數即可。

dart
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

有關更多資訊,請參閱 Dart 中的數字

字串

#

Dart 字串 (String 物件) 包含 UTF-16 碼單位的序列。您可以使用單引號或雙引號來建立字串

dart
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() 方法。

dart
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!');

您可以使用相鄰的字串文字或 + 運算子來串接字串

dart
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.');

若要建立多行字串,請使用單引號或雙引號的三重引號

dart
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

您可以使用 r 前置字元來建立「原始」字串

dart
var s = r'In a raw string, not even \n gets special treatment.';

請參閱 符號和字形群集,以取得有關如何在字串中表達 Unicode 字元的詳細資訊。

文字字串是編譯時期常數,只要任何內插表達式都是會評估為 null 或數字、字串或布林值的編譯時期常數即可。

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

有關使用字串的更多資訊,請查看 字串和正規表示式

布林值

#

若要表示布林值,Dart 有個稱為 bool 的類型。只有兩個物件具有 bool 類型:布林文字 truefalse,這兩個都是編譯時期常數。

Dart 的類型安全意味著您不能使用 if (nonbooleanValue)assert (nonbooleanValue) 等程式碼。請改為明確檢查值,如下所示

dart
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);

// Check for zero.
var hitPoints = 0;
assert(hitPoints == 0);

// Check for null.
var unicorn = null;
assert(unicorn == null);

// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

符號和字形群集

#

在 Dart 中,符號會公開字串的 Unicode 碼點。您可以使用 字元套件 來檢視或操作使用者感知的字元,也稱為 Unicode(延伸)字形群集。

Unicode 為所有書寫系統中使用的每個字母、數字和符號定義唯一的數字值。由於 Dart 字串是 UTF-16 碼單位的序列,因此在字串中表達 Unicode 碼點需要特殊語法。表達 Unicode 碼點的通常方式是 \uXXXX,其中 XXXX 是 4 位元的十六進位值。例如,愛心字元 (♥) 是 \u2665。若要指定多於或少於 4 個十六進位數字,請將值置於大括號中。例如,笑臉表情符號 (😆) 是 \u{1f606}

如果您需要讀取或寫入個別 Unicode 字元,請使用字元套件中 String 定義的 characters getter。回傳的 Characters 物件是字串,其中包含一連串的字形叢集。以下是使用字元 API 的範例

dart
import 'package:characters/characters.dart';

void main() {
  var hi = 'Hi 🇩🇰';
  print(hi);
  print('The end of the string: ${hi.substring(hi.length - 1)}');
  print('The last character: ${hi.characters.last}');
}

輸出,會根據您的環境,看起來類似這樣

$ dart run bin/main.dart
Hi 🇩🇰
The end of the string: ???
The last character: 🇩🇰

有關使用字元套件來處理字串的詳細資訊,請參閱 範例API 參考,以取得字元套件。

符號

#

Symbol 物件代表 Dart 程式中宣告的運算子或識別碼。您可能永遠不需要使用符號,但對於透過名稱來參照識別碼的 API 而言,符號非常有價值,因為縮小會變更識別碼名稱,但不會變更識別碼符號。

若要取得識別碼的符號,請使用符號文字,其僅為 # 後面接上識別碼

#radix
#bar

符號文字是編譯時期常數。