Dart語法超光速入門(1):內建型別

陳呆賊發表於2019-04-05

前言

Flutter中使用的語言是Dart,而Dart的語法和Java很相似。 本篇文章參考自Dart官方文件

變數

使用var來自動推斷變數型別

var name = 'Bob';
複製程式碼

或者使用指定型別

String name = 'Bob';
複製程式碼

如果你想讓一個變數可以被賦予多種型別,你可以使用Object或dynamic

dynamic name = 'Bob';  //Object 也是可行的
name = 123;
name = true;
複製程式碼

預設值

在Dart中所有型別都是物件,他們的預設值只可能為null。

  int a;
  bool b;
  String c;
  print(a);//null
  print(b);//null
  print(c);//null
複製程式碼

常量

final

被final標識的變數必須被初始化,且只能在初始化時被賦值一次,同時final會自動推斷型別

final name = 'Bob' 
//name = 'Tony';//錯誤,name只能被設定一次
複製程式碼

const

編譯時常量使用const來標識,const同樣會自動推斷型別

const bar = 1000000; 
const double atm = 1.01325 * bar; 
複製程式碼
var foo = const [];//一個變數被賦予了一個編譯時常量
foo = [1, 2, 3]; // foo是一個變數,可以被改變
複製程式碼
final bar = const [];//使用final修飾的bar只能被賦值一次
bar = [1,2,3];//Error: Setter not found: 'bar'.bar = [1,2,3];
複製程式碼
const baz = []; // baz是一個編譯時常量,無法被改變
baz = [42]; // Error: Constant variables can't be assigned a value.

複製程式碼

內建型別

Dart內建了對如下型別的支援

數字

int

var x = 1;
var hex = 0xDEADBEEF;
複製程式碼

從官方文件中可見

整數值不超過64位,這取決於平臺。Dart虛擬機器,值可以從-2的63次方到2的63次方- 1。編譯為JavaScript使用時,允許的值從-2的53次方到2的53次方。

double

var y = 1.1;
var exponents = 1.42e5;
double z = 1; // Equivalent to double z = 1.0.
複製程式碼

對於字串和數字之間的轉換

// String -> int
var one = int.parse('1');
// String -> double
var onePointOne = double.parse('1.1');
// int -> String
String oneAsString = 1.toString();
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
複製程式碼

位運算也和java裡的一樣,這裡的assert表示,如果assert中的表示式是false的話,則程式會丟擲異常。

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
複製程式碼

字串

在Dart中可以使用單引號或雙引號來構建一個字串

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()來獲取表示式代表的字串 如果該表示式是一個單純識別符號的話,可以省略大括號 比如s就是一個識別符號,而s.toUpperCase()就是一個表示式

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.');
複製程式碼

使用3個單引號或雙引號括起來的字串也可以寫在多行。

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.';
複製程式碼

常量字串只能由常量值拼接而成,否則會報編譯時錯誤。

// 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.前3個都是變數,無法在const常量字串中工作。
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';//編譯時錯誤,const的字串只能由const的值拼接
複製程式碼

布林值

只有兩個值true 和 false 使用bool來定義

bool value = true;
複製程式碼

陣列

一些陣列的操作如下

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);
複製程式碼

一個const常量陣列是無法改變的

var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.這會造成錯誤
複製程式碼

集合

如下定義一個集合。

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
複製程式碼

建立一個空集合

var names = <String>{};
// Set<String> names = {}; // This works, too.一樣的效果
// var names = {}; // Creates a map, not a set.這個是Map,不是Set集合
複製程式碼

通過使用add或addAll向集合新增元素

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
複製程式碼

使用.length獲取集合的元素個數

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
複製程式碼

同樣的,被const修飾的集合是無法新增或修改的

final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.錯誤
複製程式碼

Maps

定義Map

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

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
複製程式碼

使用Map構造器來構造一個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';
複製程式碼

新增一個新值

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
複製程式碼

改變一個值

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
複製程式碼

如果你需要的值不再map中,將會返回一個null

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
複製程式碼

使用.length同樣可以獲取map的元素個數

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
複製程式碼

const的map也無法改變,這裡把一個const的map賦給一個final常量,

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
複製程式碼

Runes

在Dart中runes 是字元的 UTF-32編碼.

詳情看官方文件吧,總的來說就是字元編碼的一種。

Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
//列印出這些東西  ♥  ?  ?  ?  ?  ?
複製程式碼

總結

本篇介紹了Dart的內建型別,說明了var,dynamic,final,const等修飾符的使用方法。

相關文章