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