Dart簡述
你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。
變量聲明
var
var接收任何類型的變量,但var變量一旦賦值,類型便會確定,不能再改變其類型
var t;
t = "hello world";
// 類型已經確定爲String,不能再更改其類型。
t = 1;
dynamic和Object
Object 是Dart所有對象的根基類,也就是說所有類型都是Object的子類(包括Function和Null),所以任何類型的數據都可以賦值給Object聲明的對象. dynamic與var一樣都是關鍵詞,聲明的變量可以賦值任意對象。 而dynamic與Object相同之處在於,他們聲明的變量可以在後期改變賦值類型。
dynamic t;
Object x;
t = "hi world";
x = 'Hello Object';
//下面代碼沒有問題
t = 1000;
x = 1000;
dynamic與Object不同的是,dynamic聲明的對象編譯器會提供所有可能的組合, 而Object聲明的對象只能使用Object的屬性與方法, 否則編譯器會報錯。
dynamic a;
Object b;
main() {
a = "";
b = "";
printLengths();
}
printLengths() {
// no warning
print(a.length);
// warning:
// The getter 'length' is not defined for the class 'Object'
print(b.length);
}
變量a不會報錯, 變量b編譯器會報錯
dynamic的這個特性與Objective-C中的id作用很像. dynamic的這個特點使得我們在使用它時需要格外注意,這很容易引入一個運行時錯誤.
final/const
如果您從未打算更改一個變量,那麼使用 final 或 const,不是var,也不是一個類型。 一個 final 變量只能被設置一次,兩者區別在於:const 變量是一個編譯時常量,final變量在第一次使用時被初始化。被final或者const修飾的變量,變量類型可以省略,如:
//可以省略String這個類型聲明
final str = "hi world";
//final String str = "hi world";
const str1 = "hi world";
//const String str1 = "hi world";
函數
聲明
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
Dart函數聲明如果沒有顯式聲明返回值類型時會默認當做dynamic處理,注意,函數返回值沒有類型推斷:
typedef bool CALLBACK();
//不指定返回類型,此時默認爲dynamic,不是bool
isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
void test(CALLBACK cb){
print(cb());
}
//報錯,isNoble不是bool類型
test(isNoble);