Dart基礎系列之重要概念
核心內容
最基礎的Dart程式
先看一個最基礎的Dart程式
void log(Object object) { print(object.toString()); } /// Returns a Boolean representation for [arg], which must /// be a String or bool. bool convertToBool(dynamic arg) { if (arg is bool) return arg; if (arg is String) return arg == 'true'; throw ArgumentError('Cannot convert $arg to a bool.'); }
上面的程式碼寫出了Dart最基本的一些特性。
以下的東西基本會出現在所有的Dart程式中
int
一種型別。其他一些內建型別還有是Sting, list,和bool等
42
數字,一個編譯時的常數.
print()
顯示輸出的print方法。
'...'(或"...")
字串文字
$variableName或${表達方式}
字串插值:在字串文字中包含一個變數或表示式的字串等效的字串。
main()
應用程式執行開始的頂級方法
var
一種在不指定變數型別的情況下宣告變數的方法。
Dart一些重要的概念
(1)與Java不同,Dart沒有公開、受保護和私有的關鍵字。如果識別符號以下劃線(_)開頭,則它對其庫是私有的。
(2)識別符號可以字母或下劃線(_)開頭,後面跟著這些字元的任何組合加上數字
(3)DART工具可以報告兩種問題:警告和錯誤。警告只是表明您的程式碼可能無法工作,但它們並不妨礙您的程式執行。錯誤可以是編譯時,也可以是執行時。編譯時錯誤完全阻止程式碼執行;執行時錯誤導致在執行程式碼時引發異常。
(4)DART有表示式(有執行時值)和語句(沒有)。例如,條件表示式條件?expr1:expr2的值為expr1或expr2。將其與沒有值的if-etc語句進行比較。語句通常包含一個或多個表示式,但表示式不能直接包含語句。
(5)雖然DART是強型別的,但型別註釋是可選的,因為DART可以推斷型別。在上面的程式碼中,number推斷為型別INT。當您想明確表示不需要任何型別時,使用特殊型別dynamic.
(6)DAT支援泛型型別,如List<int>(整數列表)或List<dynamic>(任何型別的物體的清單)。
(7)DART支援頂級函式(如main()),以及繫結到類或物件的函式(靜態和例項方法分別)。您還可以在函式中建立函式(巢式或區域性函式).
'...'(或"...")表示字串文字
KeyWord(關鍵字)
避免使用這些詞作為識別符號。但是, 如果有必要,標記上標的關鍵字可以是識別符號,但是表中的其他單詞是保留字不能作為是識別符號 :

keyword.png
- 上標詞1是語境關鍵詞,只有在特定的地方才有意義。到處都是有效的識別符號。
- 上標詞2是內建識別符號。為了簡化將JavaScript程式碼移植到DART的任務,這些關鍵字在大多數地方都是有效的識別符號,但它們不能用作類名或型別名稱,也不能用作匯入字首。
- 上標詞3是與非同步支援這是在Dart的1.0版本之後新增的。你不能用await或yield作為識別符號,在任何被標記為async, async ,或sync .
。
Variable(變數)
建立變數有三種方式
String name = 'Bob'; var name = 'Bob'; dynamic name = 'Bob';
(1)String很簡單,就是顯式宣告變數型別是String型別
(2)var表示name變數可以根據值('Bob')從而推斷出它的型別(String)
(3)如果物件不限於單個型別,就使用dynamic關鍵字,指定物件為dynamic型別
變數的預設值
比如語句:
int a;
那麼它的預設值就是null,並不是0。
int型別的變數和Dart中的其他所有一切都是物件
Final&&Const
Final變數必須要給個初始值,並且給定後,就不能再次賦值給該變數
final name = 'Bob'; // Without a type annotation final String nickname = 'Bobby';
再次賦值會報錯
name = 'Alice'; // Error: a final variable can only be set once.
Const變數是編譯時常量.(Const變數是隱式最終變數。)第一次使用時,將初始化最後一個頂級變數或類變數。
如果const變數位於類級別,則標記它為static const
const bar = 1000000; // Unit of pressure (dynes/cm2) const double atm = 1.01325 * bar; // Standard atmosphere
不僅用於宣告常量變數。您也可以使用它來建立常量值,以及宣告建構函式創造常數值任何變數都可以有一個常量值。
var foo = const []; final bar = const []; const baz = []; // 等同於const []
注意:可以省略常量的初始化表示式常量宣告
可以改變不是final、const修飾的變數,即使它被賦值過const常量
例如修改上述的var foo
foo = [1, 2, 3]; // Was const []
不能改變一個const常量的值,例如修改上述的const baz,就會報錯
baz = [42]; // Error: Constant variables can't be assigned a value.
內建型別
DART語言支援以下資料型別
- numbers
- strings
- booleans
- lists (also known as arrays)
- maps
- runes (for expressing Unicode characters in a string)
- symbols
(一)numbers
Dart的numbers有兩種形式
一個是int,它的整數值不大於64位,具體範圍取決於平臺。在dart vm上,值可以是
-2^63 至 2^63-1 。編譯為JavaScript的DART使用JavaScript數字允許-2^53 至2^53-1
另一個是double。64位雙精度浮點數,由IEEE 754標準指定
int和double支援基本的加減乘除運算,也可以找到abs()、ceil()和floor()其他方法。如果一些方法在int和double類裡面沒有找到,那麼在dart::math庫裡面或許可以找到
int x = 1; int hex = 0xDEADBEEF; double y = 1.1; double exponents = 1.42e5;
字串轉數字的方法
// 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');
(二)String
DART字串是一個UTF-16碼單元的序列.可以使用單引號或雙引號建立字串:
var s1 = 'Single quotes work well for string literals.'; var s2 = "Double quotes work just as well.";
可以將表示式的值放入字串中,方法是${表達}。如果表示式是識別符號,則可以跳過{}。要獲取與物件對應的字串,DAT呼叫物件的字串toString()方法。
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.');
注意:文字字串要求是編譯時常量,只要任何內插表示式是編譯時常量,比如說結果是為NULL或數值或字串或布林值。
//這些是可以內嵌到字串中的 const aConstNum = 0; const aConstBool = true; const aConstString = 'a constant 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';
(三)Booleans
為了表達布林值,Dart把型別命名為bool,有兩種型別值,true和false,他們都是編譯時常量。
注意:DART的型別安全性意味著您不能使用以下程式碼if(nonbooleanValue)或assert(nonbooleanValue),我們需要顯式地檢查值
例如
// Check for an empty string. var fullName = ''; assert(fullName.isEmpty); // Check for zero. var hitPoints = 0; assert(hitPoints <= 0); // Check for null. var unicorn; assert(unicorn == null); // Check for NaN. var iMeantToDoThis = 0 / 0; assert(iMeantToDoThis.isNaN);
(四)List
大多數程式語言中的集合都是資料或者物件組。在dart裡面陣列就是list物件
Dart list就像JavaScript陣列文字。下面是Dart的一個簡單list
var list = [1, 2, 3];
分析器推斷list有型List<int>。如果嘗試向此列表新增非整數物件,分析器或執行時將引發錯誤。list的索引從0開始,即0是第一個元素的索引
list[1] = 1; assert(list[1] == 1);
List型別支援很多操作list的方法,不可以像陣列賦值那樣直接對元素賦值
var constantList = const [1, 2, 3]; // constantList[1] = 1; // Uncommenting this causes an error.
(五)Map
可以使用Map構造方法建立物件
var gifts = Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings';
我們發現沒有new Map(),在Dart 2裡new關鍵字是可選的。
向現有的對映中新增元素
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; // Add a key-value pair
從對映中查詢值
var gifts = {'first': 'partridge'}; assert(gifts['first'] == 'partridge');
要獲取對映中鍵值對的數目,使用.length
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; assert(gifts.length == 2);
(六)Runes
在DART中,runes表示字串的UTF-32編碼
Unicode為所有世界上的書寫系統中使用的每個字母、數字和符號定義一個唯一的數字值。由於DART字串是由UTF-16程式碼單元組成的序列,因此在字串中表示32位Unicode值需要特殊的語法。
通常表示Unicode程式碼點的方法是\uXXXX,其中XXXX是一個4位的十六進位制值。例如,愛心字元(♥)是\u2665。
String類具有幾個可用於提取符文資訊的屬性,codeUnitAt和codeUnit屬性返回16位程式碼單元。使用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)); }
執行結果是這樣

runes.png
(七)Symbols
Symbol物件表示在Dart程式中宣告的運算子或識別符號。您可能永遠不需要使用符號,但它們對於按名稱引用識別符號的API非常有用,因為縮小會更改識別符號名稱而不會更改識別符號符號。要獲取識別符號的符號,請使用符號文字,它只是#後跟識別符號:
#radix #bar
這個很不常用,暫時可以忽略.....
這裡的很多內容都只是大概介紹個基礎點,裡面的每個部分都還有很多知識點細節需要學習,在之後的系列會慢慢展開來說。
漫漫人生路,偶爾還是要喝點有營養的雞湯的
人生都是走著走著就開闊了,現在的你,不用著急。讓未來的,本該屬於你的樹再長長,那些花再開開,等你遇見的時候,才是他們最美的時候。