Dart語法超光速入門(1):內置類型

前言

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

變量

使用var來自動推斷變量類型express

var name = 'Bob';
複製代碼

或者使用指定類型數組

String name = 'Bob';
複製代碼

若是你想讓一個變量能夠被賦予多種類型,你可使用Object或dynamicbash

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

默認值

在Dart中全部類型都是對象,他們的默認值只可能爲null。ide

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

常量

final

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

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

const

編譯時常量使用const來標識,const一樣會自動推斷類型this

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

從官方文檔中可見spa

整數值不超過64位,這取決於平臺。Dart虛擬機,值能夠從-2的63次方到2的63次方- 1。編譯爲JavaScript使用時,容許的值從-2的53次方到2的53次方。code

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等修飾符的使用方法。

相關文章
相關標籤/搜索