我們來繼續學習Dart語言的類型,包括Dart內置類型、Record記錄類型(Dart 3開始支持)、集合類型、泛型和typedef類型別名。在前面的學習中,基礎內置類型、集合和泛型都有所涉及和應用,本文我們和其他類型逐一進行介紹…… ...
Dart內置類型(共10類)
Dart官網文檔:https://dart.dev/language/built-in-types
Dart內置類型即Dart SDK自帶的類型,我們編程過程中可直接使用的類型,主要分為10類:
- 數值類型:包括
int
類、double
類等。 - 字元串類型:即
String
類。 - 布爾類型:即
bool
類。 - 記錄類型:即
Record
類,Dart 3中開始支持(最新版本的Java 21也支持)。 - 列表類型:即
List
類,同時也是數組。 - Set類型:即
Set
類。 - 映射類型:即
Map
類。 - 字元類型:與字元相關處理。
- 符合類型:即Symbol類。
- 特殊值:
null
空值。
Dart中類型的其他一些規則:
Object
類是Dart中除Null
之外的所有類的基類。擴展問題:Dart中頂層類是什麼呢?Enum
類是Dart中所有枚舉類的基類。擴展問題:Enum類是Object的子類嗎?答案:是。dynamic
類型Dart的靜態檢測會失效,容易引發空安全等其他運行時錯誤,建議使用Object
或者Object?
代替。Future
和Stream
支持非同步編程。Never
一般用於總是拋出異常的函數,表明表達式用於無法成功執行。void
表明值不會被再次使用,一般用戶函數返回值。
數字類型(int和double)
Dart中數字類型類結構如下:
int
和double
都是num
類的子類。int
為不超過64位的整數,double
為64位雙精度浮點數。
num
類型支持操作:加+
,減-
,乘*
,除/
,abs()
絕對值,ceil()
向上取整,floor()
向下取整操作。特別註意:位操作,如>>
右移或者<<
左移等位操作,僅int
類型支持。
代碼樣例:如下代碼,數字類型定義。
// int類型
var x = 1;
var hex = 0xDEADBEEF;
// double類型
var y = 1.1;
var exponents = 1.42e5;
double z = 1; // 等同於:double z = 1.0;
// num類型:既可以是整數,又可以是浮點數
num x = 1;
x += 2.5;
代碼樣例:如下代碼,數字類型和字元串相互轉換。
// 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;
字元串類型(String)
Dart中字元串是一個UTF-16的序列碼,我們可以通過'
單引號或者"
雙引號定義一個字元串、通過${}
進行字元串插值、通過相鄰字元串連接、使用+
符號進行連接,通過3個單引號'''
或者3個雙引號"""
定義多行字元串,還可以通過增加首碼r
定義原始字元串。
代碼樣例:如下代碼,字元串的各種定義方式。
// 引號:單引號或雙引號
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.";
// 插值
final name = 'Tom';
var s5 = 'My name is $name.';
assert(s5 == 'My name is Tome.');
// 相鄰字元串
var s6 = 'String '
'concatenation'
" works even over line breaks.";
assert(s6 ==
'String concatenation works even over '
'line breaks.');
var s7 = 'The + operator ' + 'works, as well.';
assert(s7 == 'The + operator works, as well.');
// 多行字元串:3個單引號或3個雙引號
var s8 = '''
My name is Tom.
I am a boy.
''';
var s9 = """
My name is Tom.
I am a boy.
""";
// 原始字元串
var s10 = r'My name is Tome.\nI am a boy.';
特別註意:==
雙等於號操作符在Dart中用於檢測2個對象是否相等,如果是字元串,則是校驗它們的序列碼是否相同(這與Java有很多的區別)。
代碼樣例:如下代碼,字面量字元串是編譯時常量,如果字元串插值表達式中的變數是常量,那麼插值字元串也是常量。
// 字面量字元串
const aConstString = 'a constant string';
// 插值字元串常量
const aConstNum = 0;
const aConstBool = true;
const validConstString = '$aConstNum $aConstBool $aConstString';
布爾類型(bool)
Dart中只有2個對象是bool
類型:true
和false
,且他們都是常量。
代碼樣例:如下代碼,在表達式中的布爾類型。
// 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);
字元和符號(characters)
Dart中字元代表字元串中一個Unicode編碼單元。Unicode為世界上的每個字母、數字和符合定義了一個唯一數字值。
由於Dart的字元串是UTF-16編碼,因此Dart中表示Unicode有其對應的語法格式,常用的方式為\uXXXX
代表一個字元,其中XXXX
是4位16進位的值。
舉例說明:心形字元♥的值為\u2665
,如果少於或者超過4位16禁止值,則用{}
包裹起來,如笑臉字元