Flutter學習之Dart語言基礎(內置類型)

Dart支持如下內置類型:java

  • numbers
  • strings
  • booleans
  • lists (也稱爲數組)
  • sets
  • maps
  • runes (用於在字符串中表示Unicode字符)
  • symbols
Numbers

dart中數字有兩種變量:express

  • int 整數值不大於64位,取決於平臺。Dart虛擬機中,值能夠是-263 到 263 - 1編程

  • double 64位(雙精度)浮點數,由IEEE 754標準規定。數組

  • int 和 double都是num的子類bash

num類型可進行加基本的運算,例如加減乘除,更多運算能夠參考dart:math庫app

整數是沒有小數點的數字。 如下是定義整數的一些示例:編程語言

var x = 1;
var hex = 0xDEADBEEF; //十六進制
複製代碼

若是數字包含小數,則爲雙精度數:ide

var y = 1.1;
var exponents = 1.42e5;
複製代碼

從Dart 2.1開始,必要時整數會自動轉換爲雙精度數:函數

double z = 1; 
  print("$z"); //打印 -> 1.0
複製代碼

如下是將字符串和數字互相轉換的示例:ui

// String -> int
  var one = int.parse('1');
  print('one: $one');

  // String -> double
  var onePointOne = double.parse('1.1');
  print('onePointOne: $onePointOne');

  // int -> String
  String oneAsString = 1.toString();
  print('oneAsString: $oneAsString');

  // double -> String
  String piAsString = 3.14159.toStringAsFixed(2);
  print('piAsString: $piAsString');

//打印:
//one: 1
//onePointOne: 1.1
//oneAsString: 1
//piAsString: 3.14
複製代碼

傳統位移操做:

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
複製代碼
Strings
  • Dart 字符串是使用UTF-16 編碼的,可使用單引號或者雙引號來建立字符串
  • 可使用三個單引號或者雙引號建立多行字符串對象
  • 可使用 r 前綴建立」原始raw」字符串。
  • 能夠在字符串中使用表達式: ${expression},若是表達式是一個標識符,能夠省略 {},若是表達式的結果爲一個對象,則 Dart 會調用對象的 toString() 函數來獲取一個字符串。

建立字符串:

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."; 複製代碼

多行字符串:

var string1 =
''' A multiline string ''';

var string2 =
""" Another multiline string """;

print(string1);
print(string2);

//打印:
A
multiline
string

Another
multiline
string
複製代碼

鏈接字符串:

var s1 = 'String '
    'concatenation'
    " works even over line breaks.";

var s2 = 'The + operator ' + 'works, as well.';

//打印:
//String concatenation works even over line breaks.
//The + operator works, as well.
複製代碼

原始Raw字符串(原始字符串是比較特殊的字符串,在原始字符串中,字符「\」 再也不表示轉義字符的含義):

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

//打印:
//In a raw string, not even \n gets special treatment.
複製代碼

表達式字符串:

class Expression{

  String getName() => 'Expression';

  @override
  String toString() {
    return 'This is in Expression class';
  }
}

void main() {
  var expression = new Expression();
  print(expression);
  print('name: ${expression.getName()}');
}

//打印 ->
//This is in Expression class
//name: Expression
複製代碼
Booleans

爲了表示布爾值,Dart有一個名爲bool的類型。 只有兩個對象具備bool類型:boolean true和false,它們都是編譯時常量。

Dart中bool對象未初始化的默認值是null:

bool bb;

if (bb == false){

  print('It\s false.');

} else{

  print('It\s true.');

}

//打印 -> 
//Its true.
複製代碼

由於bb爲null,因此不等於false,所以這裏打印null。

Lists

也許幾乎每種編程語言中最多見的集合是數組或有序的對象組。 在Dart中,數組是List對象,所以大多數人只是將它們稱爲List。 這是一個簡單的Dart列表:

var list = [1, 2, 3];

//打印 ->
//[1, 2, 3]
複製代碼

Dart中能夠直接打印list包括list的元素,List也是對象。java中直接打印list結果是地址值。

這裏定義var list = [1, 2, 3]時,Dart推斷list的類型爲List 。 若是嘗試將非整數對象添加到此列表,則分析器或運行時會引起錯誤。

lists.png

Dart中List的下標索引和java同樣從0開始:

var list = [5, 6, 7];
for (int i = 0; i < list.length; i++){
  print('index$i = ${list[i]}');
}

//打印 ->
//index0 = 5
//index1 = 6
//index2 = 7
複製代碼

和java同樣支持泛型

generic.png

經常使用操做: 1.增刪改查

var list = [5, 6, 7];
list.add(8); //增
list.remove(8); //刪
list[0] = 55; //改
bool containsSix = list.contains(6); //查
print('containssix: $containsSix');

print(list);

//打印 ->
//contains six: true
//[55, 6, 7]
複製代碼

2.倒序

var list = [5, 6, 7];
print(list);
print('after reversed: ${list.reversed}'); //並不會改變本來list順序
print(list);

//打印 ->
//[5, 6, 7]
//after reversed: (7, 6, 5)
//[5, 6, 7]
複製代碼

3.排序

var list = ['AAA', 'AA', 'AAAA'];

print('before sort: $list');
list.sort((a, b) => a.length.compareTo(b.length)); //根據字符串長度排序
print('after sort: $list');

//打印 ->
//before sort: [AAA, AA, AAAA]
//after sort: [AA, AAA, AAAA]
複製代碼

4.洗牌

var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
print('before suffle: $list');
list.shuffle();
print('after suffle: $list');

//打印 ->
//before suffle: [1, 2, 3, 4, 5, 6, 7, 8, 9]
//after suffle: [8, 3, 2, 7, 5, 9, 4, 1, 6]
複製代碼

5.合併

var list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var list2 = [11, 12, 13, 14, 15, 16, 17, 18, 19];

var list3 = list1 + list2;
print('list3: $list3');

//打印 ->
//list3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19]
複製代碼
Sets

Dart中的集合(set)是沒有順序且不能重複的集合,因此不能經過索引去獲取值:

Set<String> set = new Set();
set.add('A');
set.add('B');
set.add('C');
set.add('D');
set.add('E');
set.add('F');
set.add('G');
set.add('A');
set.add('B');

//打印 >
//{A, B, C, D, E, F, G}
複製代碼

set.png

經常使用操做: 1.difference: 返回set1集合裏有但set2裏沒有的元素集合

Set<String> set1 = new Set();
set1.add('A');
set1.add('B');
set1.add('C');
set1.add('D');
set1.add('E');
set1.add('F');


Set<String> set2 = new Set();
set2.add('A');
set2.add('1');
set2.add('2');
set2.add('3');
set2.add('4');
set2.add('5');

print('difference: ${set1.difference(set2)}');

//打印 ->
//difference: {B, C, D, E, F}
複製代碼

2.交集intersection: 返回set1和set2的交集

Set<String> set1 = new Set();
set1.add('A');
set1.add('B');
set1.add('C');


Set<String> set2 = new Set();
set2.add('A');
set2.add('A');
set2.add('B');
set2.add('1');

print('intersection: ${set1.intersection(set2)}');

//打印 ->
//intersection: {A, B}
複製代碼

3.並集union:返回set1和set2的並集

Set<String> set1 = new Set();
set1.add('A');
set1.add('B');
set1.add('C');


Set<String> set2 = new Set();
set2.add('1');
set2.add('2');
set2.add('3');

print('union: ${set1.union(set2)}');

//打印 ->
//union: {A, B, C, 1, 2, 3}
複製代碼

4.retainAll():set1保留某些元素(刪除全部set1中有而set2中沒有的元素即保留set1和set2同時存在的元素)

Set<String> set1 = new Set();
set1.add('1');
set1.add('2');
set1.add('E');
set1.add('F');
set1.add('G');

Set<String> set2 = new Set();
set2.add('A');
set2.add('B');
set2.add('C');
set2.add('1');
set2.add('2');
set2.add('3');

set1.retainAll(set2);
print('retainAll: $set1');

//打印 ->
//retainAll: {1, 2}
複製代碼
Maps

一般,map是關聯鍵和值的對象,dart中能夠經過如下方式建立map:

//類型爲Map<String, String>
var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

//類型爲Map<int, String>
var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

print(gifts);
print(nobleGases);

//打印 ->
//{first: partridge, second: turtledoves, fifth: golden rings}
//{2: helium, 10: neon, 18: argon}
複製代碼

若是嘗試將錯誤類型的值添加到任一映射,則分析器或運行時會引起錯誤(這裏gifts添加一個key爲2value爲what的數據)

map.png

也可使用Map構造函數建立相同的對象:

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

//打印 ->
//{first: partridge, second: turtledoves, fifth: golden rings}
//{2: helium, 10: neon, 18: argon}
複製代碼

經常使用操做: 1.新增鍵值對

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; 

print(gifts);

//打印 ->
//{first: partridge, fourth: calling birds}
複製代碼

2.獲取一個值

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';

print("first: ${gifts['first']}");
print("second: ${gifts['second']}");
print("fifth: ${gifts['fifth']}"); //map中並無該鍵值對,返回null

//打印 ->
//first: partridge
//second: turtledoves
//fifth: null
複製代碼

3.兩個map相加:

var map1 = {
'a' : 10,
'b' : 11,
'c' : 12,
};

var map2 = {
'a' : 10,
'e' : 20,
'f' : 21,
'g' : 22,
};

map1.addAll(map2);
print('map1 + map2 = $map1');

//打印 ->
//map1 + map2 = {a: 10, b: 11, c: 12, e: 20, f: 21, g: 22} 
複製代碼
Runes

在Dart中,runes是字符串的UTF-32代碼點。 因爲Dart字符串是UTF-16代碼單元的序列,所以在字符串中表示32位Unicode值須要特殊語法。

咱們知道, 在Unicode字符集中的某個字符對應的代碼值,稱做代碼點(Code Point),用16進製表示,一般加上U+前綴,Dart中則爲\u。好比,‘你’的代碼點是\u4f60;‘好’的代碼點是\u597d。要指定多於或少於4個十六進制數字,請將值放在大括號中, 例如,笑的表情符號(😆)是\u {1f600}。

咱們這裏須要瞭解兩個概念: 代碼點(code point):是指編碼字符集中,字符所對應的數字,佔用一個 Unicode 編碼位的字符。有效範圍從U+0000到U+10FFFF。其中U+0000到U+FFFF爲基本字符,U+10000到U+10FFFF爲增補字符。

代碼單元(code unit):表示指定編碼格式編碼的數量,對於小於 U+FFFF 的字符來講,使用 UTF-16 編碼須要一個代碼點,大於 U+FFFF 的字符須要使用兩個代碼點來表示。

更多Unicode相關知識可自行百度。

如下示例說明了runes,16位代碼單元和32位代碼點之間的關係:

var clapping = '\u{1f44f}';  //建立一個使用UTF-16編碼的string
print(clapping);
print('string code unit: ${clapping.codeUnits}'); //兩個代碼單元
print('string code point: ${clapping.runes.toList()}'); //一個代碼點

Runes runes = new Runes('\u{1f44f}'); //建立一個使用UTF-32編碼的Runes
print('runes code point: ${runes.toList()}'); //一個代碼點

//打印-> 
//👏
//string code unit: [55357, 56399]
//string code point: [128079]
//runes code point: [128079]
複製代碼

能夠看到使用UTF-16編碼的clpping的代碼點和使用UTF-32編碼的Runes是同樣的,那Runes到底做用是什麼? Runes實際上是一個用UTF-32進行編碼的的String。

var sInput =  '\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}'; //使用UTF-16進行編碼
Runes input = new Runes(
  '\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}'); //使用UTF-32進行編碼

print(new String.fromCharCodes(input)); //UTF-32轉UTF-16的時候調用了fromCharCodes
print(sInput);

//打印 ->
//♥  😅  😎  👻  🖖  👍
//♥  😅  😎  👻  🖖  👍
複製代碼

方法源碼爲:

external factory String.fromCharCodes(Iterable<int> charCodes,
      [int start = 0, int end]);
複製代碼

若是傳遞的charCodes爲UTF-16的代碼單元,則逐字複製 若是傳遞的charCodes的值大於16位,則將其分解爲代理項對:

var clef = new String.fromCharCodes([0x1D11E]); //大於 FFFF
clef.codeUnitAt(0); // 0xD834
clef.codeUnitAt(1); // 0xDD1E
複製代碼
Symbols

主要是反射用,如今mirrors模塊已經被移除

Symbols.png
相關文章
相關標籤/搜索