變量聲明
這是一個聲明變量的例子:
var name = 'Bob';
這里其實類似kotlin的類型推斷皇拣,最后編譯出來的name是String類型的對象严蓖。值為Bob薄嫡。
如果想像Object那樣存儲任意類型,那么可以直接使用Object
或者dynamic
關鍵字颗胡。
當然也可以明確指定變量類型:
String name = 'Bob';
變量默認值
在dart中所有變量的默認值都是null毫深,即使是數字變量。所以數字變量也是需要判空的毒姨。
int lineCount;
assert(lineCount == null);
final和const
類似于kotlin哑蔫,const指定的是一個字面量(編譯時常量),而final則是初始化時又一次賦值(運行時常量)弧呐,之后就再也不能變化的常量闸迷。
注意:final類型的變量在初始化時必須進行賦值,這點和java很像俘枫,可以在構造函數中賦值腥沽。
一個變量被final修飾的話可以省去var關鍵字:
final name = 'Bob';
final String nickname = 'Bobby';
const通常用來修飾頂層字面量,如果要是在類中則要使用static const
鸠蚪,通辰裱簦可以聲明一個數字,字符串邓嘹,或者一個表達式:
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere
const T = true;
const num = T?41:43;
const
關鍵字不僅僅可以用來指定常量酣栈,也可以給變量聲明為一個常量值比如:
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
這里的const關鍵字可以省略,就想baz一樣汹押。const修飾的東西內容不可以改變矿筝,但foo那種則本身是一個變量,可以更改值棚贾。
內置類型(Built-in types)
內置類型有以下幾個:
- numbers
- strings
- booleans
- lists(also known as arrays)
- maps
- runes(用于在字符串中表達Unicode字符)
- symbols
它們都是一些對象窖维,有一些有自己的構造方法例如:Map()
int
Integer values no larger than 64 bits, depending on the platform. On the Dart VM, values can be from -2^63 to 2^63 - 1. Dart that’s compiled to JavaScript uses JavaScript numbers, allowing values from -2^53 to 2^53 - 1.
double
double遵循IEEE 754標準,也是64位的妙痹。
int和double都是num類型的子類铸史。num類型重載了加減乘除運算符,也包含絕對值abs()
怯伊,向上向下取整的運算ceil
和floor
琳轿。
移位運算符則在int中重載。更多的數字運算則在dart:math
庫中存在耿芹。
字符串和數字之間的轉換
// 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');
位運算
這個其實不太常用姑且記下:
The int type specifies the traditional bitwise shift (<<, >>), AND (&), and OR (|) operators. For example:
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 = '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.";
字符串模板
字符串模板與kotlin和php的一樣吧秕,這里不加贅述了琉闪。但在dart中==
運算比較的是字符串的內容,這點和kotlin是一樣的砸彬。字符串拼接也是加號颠毙。
多行字符串
這有點類似于kotlin斯入,或者<pre>:
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
dart中比較好的一點是,如果你想打印raw字符串蛀蜜,則可以加上r表示:
var s = r'In a raw string, not even \n gets special treatment.';
字符串字面量是一個編譯時常量刻两,可以賦值在const上,這點和kotlin一樣的:
// 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.
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';
Lists
或許大多數的語言中最常用的是數組涵防,但dart中它是一個List對象下面是一個簡單的dart list:
var list = [1,2,3];
這里的list變量會被分析為List<int>
類型闹伪,如果你試圖將一個非整形的值放入其中,就會產生異常壮池。
List和數組一樣偏瓤,也是從零開始的。
List的用法和java的數組很像椰憋,但其實它就是一個對象厅克。List有很多方便的工具方法。這里在后續(xù)章節(jié)中詳述
Maps
Map和Java以及大多數語言的定義一樣橙依,都是只有一個唯一的key证舟,這個key指定一個value。dart支持map字面量和Map類型:
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
這里詞法分析器會斷定gifts
是一個Map<String, String>
類型窗骑,而nobleGases
是一個Map<int, String>
女责,如果你試圖添加錯誤的類型,就會報錯创译。
你可以使用Map構造器來創(chuàng)建:
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';
如果獲取一個不存在的key的值抵知,那么就會返回null。
var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);
length屬性指代鍵值對的數量软族。
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
一個map可以是一個字面量:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
Runes
在dart中Runes是一個UTF-32編碼的字符串刷喜。Unicode定義了一個數字化的值給一個字符,但UTF-16定一個的字符串還是有限的立砸,String要是想表達UTF-32的字符就需要一些特殊的語法掖疮。
通常的表達Unicode的方法是\uXXXX
,XXXX是一個四位的十六進制,例如(?) is \u2665颗祝,如果要表達多于或者少于4個16進制數的時候就要使用一個大括號浊闪,例如:(??) is \u{1f600}.
String類又一些方法可以轉換成Runes類型。codeUnits屬性可以獲取字符位數組螺戳。runes屬性則可以生成Runes對象
下面是一個測試用例:
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
output:
??
[55357, 56399]
[128079]
? ?? ?? ?? ?? ??