內建類型
Dart 語言特別支援以下類型
- 數字 (
int
,double
) - 字串 (
String
) - 布林值 (
bool
) - 記錄 (
(value1, value2)
) - 函數 (
Function
) - 列表 (
List
,也稱為陣列) - 集合 (
Set
) - 映射 (
Map
) - Runes (
Runes
;通常由characters
API 取代) - 符號 (
Symbol
) - 值
null
(Null
)
此支援包含使用字面值建立物件的能力。例如,'this is a string'
是一個字串字面值,而 true
是一個布林字面值。
由於 Dart 中的每個變數都參照到一個物件,即類別的實例,因此您通常可以使用建構子來初始化變數。某些內建類型有自己的建構子。例如,您可以使用 Map()
建構子來建立映射。
某些其他類型在 Dart 語言中也具有特殊作用
Object
:除了Null
之外,所有 Dart 類別的超類別。Enum
:所有列舉的超類別。Future
和Stream
:用於非同步支援。Iterable
:用於for-in 迴圈和同步產生器函數。Never
:表示運算式永遠無法成功完成評估。最常用於總是拋出例外狀況的函數。dynamic
:表示您想要停用靜態檢查。通常您應該改用Object
或Object?
。void
:表示永遠不會使用值。常用作回傳類型。
Object
、Object?
、Null
和 Never
類別在類別階層中具有特殊作用。在了解空值安全中了解這些作用。
數字
#Dart 數字有兩種風味
int
- 不超過 64 位元的整數值,取決於平台。在原生平台上,值可以從 -263 到 263 - 1。在 Web 上,整數值表示為 JavaScript 數字 (不含小數部分的 64 位元浮點值),可以從 -253 到 253 - 1。
double
- 64 位元 (雙精度) 浮點數,如 IEEE 754 標準所指定。
int
和 double
都是 num
的子類型。num 類型包含基本運算子,例如 +、-、/ 和 *,並且也是您找到 abs()
、ceil()
和 floor()
等方法的地方。(位元運算子,例如 >>,在 int
類別中定義。) 如果 num 及其子類型沒有您要尋找的內容,則 dart:math
函式庫可能會提供。
整數是不含小數點的數字。以下是一些定義整數字面值的範例
var x = 1;
var hex = 0xDEADBEEF;
如果數字包含小數點,則它是 double。以下是一些定義倍精準度浮點數字面值的範例
var y = 1.1;
var exponents = 1.42e5;
您也可以將變數宣告為 num。如果您這樣做,則變數可以同時具有整數和倍精準度浮點數值。
num x = 1; // x can have both int and double values
x += 2.5;
整數字面值在必要時會自動轉換為倍精準度浮點數
double z = 1; // Equivalent to double z = 1.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 (|
) 和 XOR (^
) 運算子,這些運算子對於操作和遮罩位元欄位中的標誌很有用。例如
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 | 4) == 7); // 0011 | 0100 == 0111
assert((3 & 4) == 0); // 0011 & 0100 == 0000
如需更多範例,請參閱位元和位移運算子章節。
數字字面值是編譯時期常數。許多算術運算式也是編譯時期常數,只要它們的運算元是評估為數字的編譯時期常數。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
如需更多資訊,請參閱Dart 中的數字。
您可以使用一或多個底線 (_
) 作為數字分隔符,使長數字字面值更易於閱讀。多個數字分隔符允許更高等級的分組。
var n1 = 1_000_000;
var n2 = 0.000_000_000_01;
var n3 = 0x00_14_22_01_23_45; // MAC address
var n4 = 555_123_4567; // US Phone number
var n5 = 100__000_000__000_000; // one hundred million million!
字串
#Dart 字串 (String
物件) 保留 UTF-16 程式碼單位的序列。您可以使用單引號或雙引號來建立字串
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.";
您可以使用 ${
運算式
}
將運算式的值放在字串內。如果運算式是識別碼,您可以跳過 {}
。為了取得對應於物件的字串,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.';
請參閱Runes 與字素叢集,以了解如何在字串中表示 Unicode 字元的詳細資訊。
字串字面值是編譯時期常數,只要任何內插運算式是評估為 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';
如需更多關於使用字串的資訊,請查看字串和正規表示式。
布林值
#為了表示布林值,Dart 有一個名為 bool
的類型。只有兩個物件具有 bool 類型:布林字面值 true
和 false
,它們都是編譯時期常數。
Dart 的類型安全表示您不能使用像 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 = null;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
Runes 與字素叢集
#在 Dart 中,runes 公開字串的 Unicode 程式碼點。您可以使用 characters 套件來檢視或操作使用者感知到的字元,也稱為 Unicode (擴充) 字素叢集。
Unicode 為世界上所有書寫系統中使用的每個字母、數字和符號定義了唯一的數值。由於 Dart 字串是 UTF-16 程式碼單位的序列,因此在字串中表示 Unicode 程式碼點需要特殊語法。表示 Unicode 程式碼點的常用方法是 \uXXXX
,其中 XXXX 是 4 位數的十六進位值。例如,紅心字元 (♥) 是 \u2665
。若要指定多於或少於 4 個十六進位數字,請將值放在大括號中。例如,大笑表情符號 (😆) 是 \u{1f606}
。
如果您需要讀取或寫入個別的 Unicode 字元,請使用 characters 套件在 String 上定義的 characters
getter。傳回的 Characters
物件是作為字素叢集序列的字串。以下是使用 characters API 的範例
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: 🇩🇰
如需使用 characters 套件來操作字串的詳細資訊,請參閱 characters 套件的 範例 和 API 參考。
符號
#Symbol
物件表示在 Dart 程式中宣告的運算子或識別碼。您可能永遠不需要使用符號,但對於透過名稱參照識別碼的 API 來說,它們非常寶貴,因為縮小化會變更識別碼名稱,但不會變更識別碼符號。
若要取得識別碼的符號,請使用符號字面值,它只是 #
後面跟著識別碼
#radix
#bar
符號字面值是編譯時期常數。
除非另有說明,否則本網站上的文件反映 Dart 3.7.1 版本。頁面上次更新於 2025-02-28。 檢視原始碼 或 回報問題。