內建型別
Dart 語言對以下型別有特殊支援
- 數字 (
int,double) - 字串 (
String) - 布林值 (
bool) - 記錄 (
(value1, value2)) - 函式 (
Function) - 列表 (
List, 也稱為陣列) - 集合 (
Set) - 對映 (
Map) - Runes (
Runes;常被charactersAPI 替換) - Symbol (
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- 根據 IEEE 754 標準指定的 64 位(雙精度)浮點數。
int 和 double 都是 num 的子型別。num 型別包含基本運算子,例如 +、-、/ 和 *,以及 abs()、ceil() 和 floor() 等方法。(位運算子,如 >>,定義在 int 類中。)如果 num 及其子型別沒有你想要的功能,dart:math 庫可能會有。
整數是沒有小數點的數字。以下是一些定義整數字面量的示例
var x = 1;
var hex = 0xDEADBEEF;如果一個數字包含小數點,它就是一個 double。以下是一些定義 double 字面量的示例
var y = 1.1;
var exponents = 1.42e5;你也可以將變數宣告為 num 型別。如果這樣做,該變數可以同時擁有整數和 double 值。
num x = 1; // x can have both int and double values
x += 2.5;必要時,整數字面量會自動轉換為 doubles
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 型別指定了傳統的位移(<<、>>、>>>)、補碼(~)、按位與(&)、按位或(|)和按位異或(^)運算子,這些運算子對於操作和遮蔽位欄位中的標誌非常有用。例如
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.";你可以使用 ${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.';有關如何在字串中表示 Unicode 字元的詳細資訊,請參閱Runes 和字素簇。
字串字面量是編譯時常量,只要任何內插表示式是求值為 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 (非布林值) 或 assert (非布林值) 這樣的程式碼。而是要顯式地檢查值,像這樣
// 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 package 來檢視或操作使用者感知的字元,也稱為Unicode(擴充套件)字素簇。
Unicode 為世界上所有書寫系統中使用的每個字母、數字和符號定義了一個唯一的數值。由於 Dart 字串是一系列 UTF-16 碼元,因此在字串中表達 Unicode 碼點需要特殊語法。表達 Unicode 碼點的通常方法是 \uXXXX,其中 XXXX 是一個 4 位十六進位制值。例如,心形字元 (♥) 是 \u2665。要指定多於或少於 4 位十六進位制數字,請將值放在花括號中。例如,笑臉表情符號 (😆) 是 \u{1f606}。
如果你需要讀取或寫入單個 Unicode 字元,請使用 characters package 在 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 package 操作字串的詳細資訊,請參閱 characters package 的示例和API 參考。
Symbol
#一個 Symbol 物件表示 Dart 程式中宣告的運算子或識別符號。你可能永遠不需要使用 symbol,但對於按名稱引用識別符號的 API 來說,它們是無價的,因為程式碼混淆會改變識別符號名稱,但不會改變識別符號 symbol。
要獲取識別符號的 symbol,請使用 symbol 字面量,它只是在識別符號前面加上 #
#radix
#barSymbol 字面量是編譯時常量。