Dart教程(一)類型

引言

人生之路在於不斷學習,今天便來講講dart的基礎知識。

類型定義

Dart的類型很少,很容易掌握。

  • 數字
  • 字符串(String)
  • 布爾(bool)
  • 列表(list)
  • 集合(set)
  • 映射(map)
  • 用於在字符串中表示Unicode字符(runes)
  • 符號標誌(symbols)

數字

僅有兩種類型,int和double。
其中int的範圍是-2的63次冪到2的63次冪 - 1。
double爲64位符合IEEE 754標準。
int例子如下:

int x = 1;
int hex = 0xDEADBEEF;
//也可以使用類型推斷
var y = 2;

double例子如下:

double k = 3.2;
var y = 1.1;
var exponents = 1.42e5;
//Dart 2.1之後,這也是合法的
double xx = 1;

數字與字符串的相互轉換

assert爲Dart中的斷言,在debug中如果斷言表達式爲false,會跑出異常並終止運行,在生產環境則不起作用。

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

以下常量聲明均爲合法

const x = 1;
const y = 2*x;
const z = y*x;

位運算(int類型纔有

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

字符串

在Dart中,字符串爲UTF-16,單引號和雙引號並無明顯區別,如果是字符串嵌套,建議使用雙引號中嵌入單引號的方式。

var s1 = '單引號是ok的';
var s2 = "雙引號也是ok的";
var s3 = '可以這麼表達:It\'s ';
var s4 = "也可以用雙引號嵌單引號的形式表達:It's";

可以使${表達式}$變量來拼接字符串,當然了,也可以使用java中的+方式。

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中,==用來判斷兩個對象是否相等,對於String來說,兩個字符串的字符相同,即爲相等。
一行字符串的表達,可以使用分行的形式

String s = '一行'
	'字符串'
    "。";
    //輸出:一行字符串。

多行字符串可以使用如下表達

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

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

保留字符串源格式,僅需在字符串前加入前綴r即可

var s = r'可以正常輸出換行符 \n';

字符串常量需要每部分均爲常量。

const a = "合法";
var b = 2;
//const b = "不合法$b";
const c = "合法$a";

布爾

表現於java基本一致,爲了安全,需要顯示的指出判斷值爲布爾

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

列表

在Dart中,List的表現非常像JavaScript中的數組

var list = [1, 2, 3];

如下聲明也是可以的

List list = ["1a","2b"];

創建不可更改內容的List如下:

var constantList = const [1, 2, 3];
// constantList[1] = 1; // 錯誤,不可更改
constantList = [4,5];//正確

Dart 2.3引入了擴展運算符(…)和空值感知擴展運算符(…?),它提供了一種將多個元素插入集合的簡潔方法。

例如,可以使用擴展運算符(…)將列表的所有元素插入另一個列表:

var list = [1, 2, 3];
var list2 = [0, ...list];//[0, 1, 2, 3]
assert(list2.length == 4);

如果擴展運算符右側的表達式可能爲null,則可以通過使用支持null的擴展運算符(…?)來避免異常:

var list;
var list2 = [0, ...?list];//[0]
assert(list2.length == 1);

在Dart2.3中,也可以使用if或者for來構建列表
使用if的例子:

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

使用for的例子

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

集合

set是一組無序的,無重複的集合。使用{}來聲明set。

Set<String> a = {"1","1"};//僅會有一個1

聲明一個空set

var names = <String>{};
// Set<String> names = {}; // 等價於上行
// var names = {}; // 會創建一個Map<dynamic, dynamic>,而不是set

創建不可更改的set

final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // 錯誤,無法添加

映射

map的使用幾乎和java一致。
下面的例子創建了map

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

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

也可以使用這種方式

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

檢索map則於JavaScript一致

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

創建常量map

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

Runes

在Dart中,符文是字符串的UTF-32代碼點。

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

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

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

以下示例說明了符文,16位代碼單元和32位代碼點之間的關係。
在這裏插入圖片描述

Symbol

Symbol對象表示Dart程序中聲明的運算符或標識符。 您可能永遠不需要使用符號,但它們對於按名稱引用標識符的API非常有用,因爲縮小會更改標識符名稱而不會更改標識符符號。

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

#radix
#bar
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章