Dart語言詳解(二)——基本語法

Demo_Yang發表於2020-03-11
Dart語言詳解(二)——基本語法

想學Flutter,就請關注這個專欄
想學Flutter,就請關注這個專欄
Flutter系列(一)——詳細介紹

Flutter系列(二)——與React Native進行對比

Flutter系列(三)——環境搭建(Windows)

Flutter系列(四)——HelloWorld

Dart語言詳解(一)——詳細介紹

Dart語言詳解(二)——基本語法

文件歸檔:
github.com/yang0range/…

前言

之前,詳細的介紹了一下Dart語言的前世今生,接下來,我們就該深入的瞭解Dart語言,瞭解Dart語言的基本資料型別,語法等相關的內容

變數和資料型別

變數

命名

在Dart語言當中,定義變數的方式是

dataType viriableName = Initial Valute
複製程式碼

這裡其實和Java是一樣的,不僅如此連命名的方式也和Java相同,都是採用駝峰命名的方式。

宣告

在宣告的時候,除了基本資料型別之外,還有三種變數的宣告。

var,dynamic,Object

var:如果沒有初始值的時候,var可以變成任意型別。

dynamic:動態任意型別,編譯階段不檢查型別。

Object: 動態任意型別,在編譯階段檢查型別。

和var的區別:
var如果有初始值,那麼型別會被鎖定。

變數的預設值

1.沒有初始值的變數會自動獲取一個預設值null
2.一切皆為物件,物件的預設值是null

final和const

表示不可改變
相同點:

  • 宣告的型別可以省略
  • 初始化後不能再賦值
  • 不能和var同時使用

不同點:

  • 類級別常量,使用static const
  • const可使用其他const 常量的值來初始化其值
  • 使用const賦值宣告,const可以省略
  • 可以更改非final、非const變數的值。即使曾經具有const值
  • const導致的不可變性是可以傳遞的
  • 相同的const常量不會再記憶體中重複建立
  • const需要是編譯時常量

基本資料型別

Dart總共又8種基本資料型別。
分別是:


image.png
image.png
Numbers 數值型

數值型裡面有包含了int型和doubule兩種型別,這兩種和Java類似,其中int是整數型,double是64-bit雙精度浮點數,這兩種都是Numbers型別的子類。

String

Dart字串是UTF-16編碼的字元序列。

1.可以使用單引號或者雙引號來建立字元
例如:

void main() {
  print("This is a String");
  print('This is also a stirng');
}
複製程式碼

這兩個是一樣的。

2.字串拼接
例如:

void main() {
  String s1 = "First string.";
  String s2 = "Second string";
  print(s1 + s2);
}

複製程式碼

3.字元插值
${exprsssion},如果表示式是一個識別符號,可以省略{},如果表示式的結果為一個物件,Dart會呼叫物件的toString()函式來獲取一個字串。
例如:

void main() {
  String s1 = "First string.";
  print("String $s1");
}

複製程式碼
void main() {
  print("The sum of 1 and 1 equals ${1 + 1}.");
}

複製程式碼

4.多行顯示
使用雙引號建立多行字元
還可以使用(')和(")
例如:

 var s = 'Firtst'
  'Second'
  "Third";
   print(s);
複製程式碼

使用三引表示多行字元
例如

 var multilineString = """This is a
   multiline string
   consistiong of
   multiple lines""";
  print(multilineString);
複製程式碼

5.使用r字首建立“原始raw”字串

  String s4 ="adbchi\ndfafa";
  print(s4);

  String s5 =r"adbchi\ndfafa";
  print(s5);
複製程式碼

輸出的結果

I/flutter (17682): adbchi
I/flutter (17682): dfafa
I/flutter (17682): adbchi\ndfafa
複製程式碼
Bool

Dart的bool和Java類似只有兩種型別,一種是true一種是false,但是,不同的是bool物件未初始化的預設值是null。

List
  • 因為在Dart當中,由一切皆為物件的概念,Dart就可以直接列印list包含list的元素,這點和Java由明顯的不同,java中直接列印list結果是地址值。
    例如
 var list = [0, 1, 2, 3, 4, 5, 6];
  print(list);
複製程式碼

列印出結果

I/flutter (24300): [0, 1, 2, 3, 4, 5, 6]
複製程式碼
  • Dart中List的下標索引和java一樣都是從0開始。
  • Dart中List也支援泛型,這點和java一樣,同時還可以進行泛型的判斷。
 var list1 = List<String>();
 print(list1 is List<String>);
 輸出:
 true

複製程式碼
  • 有增刪改查的操作,支援倒敘,自帶順序,洗牌,可以使用+將兩個List合併。
    例如
  var list = [0, 1, 2, 3, 4, 5, 6];
  print(list);
  var list2 = [7,8,9,10,11];

  print(list+list2);
   輸出:
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
複製程式碼
Set

Dart裡面的Set和Java類似,也是不能存放重複的元素。

  • 兩種初始化方式
    Set有兩種初始化方式
    var setName = <dataType>{}
    Set<dataType> setName ={}
    複製程式碼
  • 大部分操作是和Java類似的
    不同的地方:
  • difference:返回set1集合裡面有但是set2裡面沒有的元素集合
 Set<String> set1 = {"1","2","3","4","5"};
 Set<String> set2 = {"1","2","3"};
 print(set1.difference(set2));
 輸出:
 {4, 5}
複製程式碼
  • intersection:返回set1和set2的交集
Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.intersection(set2));
 輸出:
{1, 2, 3}
複製程式碼
  • union:返回set1和set2的並集
 Set<String> set1 = {"1","2","3","4","5"};
  Set<String> set2 = {"1","2","3"};
  print(set1.union(set2));
   輸出:
{1, 2, 3, 4, 5}
複製程式碼
  • retainAll:set1只保留某些元素(要保留的元素要在原set中存在)
Map

和Java類似

Runes

Runes再Dart當中是字元的UTF-32的編碼

Main(){
  Runes runes = new Runes('\u{1f605} \u6211‘);
  var str1 = String.fromCharCodes(runes);  
  print(str1);
}

複製程式碼
Symbol

Symbol識別符號,主要是反射的作用,現在再mirrors模組已經被移除了。

函式

定義

總體來說,和java類似。
其他幾個特單:

  • 可在函式內定義
  • 定義函式時可以省略型別
  • 支援縮寫語法=>
int add(int a, int b) => a + b;
複製程式碼

可選引數

  • 可以選擇命名引數
  • 可以選擇位置引數
  • 可以新增預設引數
printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello');
}
複製程式碼
printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75);
}
複製程式碼
printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello', s2: 'there');
}
複製程式碼
String mysteryMessage(String who, [String what, String where]){
  var message = '$who';
  if(what != null && where == null){
    message = '$message said $what';
  } else if (where != null){
    message = '$message said $what at $where';
  }
  return message;
}

main() {
  var result = mysteryMessage('Billy', 'howdy', 'the ranch');
  print(result);
}
複製程式碼

匿名函式

  • 可以賦值給變數,通過變數呼叫
  • 可以在其他函式當中直接呼叫或者傳遞給其他函式
//匿名函式
  //賦值給變數
  //無參匿名函式
  var anonFunc1 = () => print('無參匿名函式');
  anonFunc1();

  //有參匿名函式
  var anonFunc = (name) => 'I am $name';
  print(anonFunc('damon'));

  //通過()呼叫,不推薦
//  (()=>print('不推薦'))();

  //匿名函式傳參
  List test(List list, String func(str)) {
    for (var i = 0; i < list.length; i++) {
      list[i] = func(list[i]);
    }
    return list;
  }

  var list = ['d', 'a', 'm', 'o', 'n'];
  print(test(list, (str) => str * 2)); //String * int, Dart和Python可以這樣用

  //List.forEach()就用的匿名函式
  List list1 = [11, 12, 13];
  list1.forEach((item) => print('$item'));

  //返回Function物件(閉包)
  Function makeAddFunc(int x) {
    x++;
    return (int y) => x + y;
  }

  var addFunc = makeAddFunc(2);
  print(addFunc(3));

  // 函式別名
  MyFunc myFunc;
  //可以指向任何同簽名的函式
  myFunc = subtsract;
  myFunc(4, 2);
  myFunc = divide;
  myFunc(4, 2);
  //typedef 作為引數傳遞給函式
  calculator(4, 2, subtsract);
}

//函式別名
typedef MyFunc(int a, int b);
//根據MyFunc相同的函式簽名定義兩個函式
subtsract(int a, int b) {
  print('subtsract: ${a - b}');
}

divide(int a, int b) {
  print('divide: ${a / b}');
}
//typedef 也可以作為引數傳遞給函式
calculator(int a, int b, MyFunc func) {
  func(a, b);
}
複製程式碼

邏輯運算

操作符

操作符大部分也和Java相同。


image.png
image.png

標紅的是不同的,下面著重介紹一下。

?.

條件成員訪問 和 . 類似,但是左邊的操作物件不能為 null,例如 foo?.bar 如果 foo 為 null 則返回 null,否則返回 bar 成員。

 String a;
print(a?.length);
輸出null

 String a="aaa";
print(a?.length);
輸出 3
複製程式碼
~/

取商操作符
被除數 ÷ 除數 = 商 ... 餘數,A ~/ B = C,這個C就是商。相當於Java裡的 /

:as、is、is!

型別判定操作
型別判定操作符:as、is、is!在執行時判定物件型別

 //as 型別轉換
  num iNum = 1;
  num dNum = 1.0;
  int i = iNum as int;
  double d = dNum as double;
  print([i, d]);

//  String s = iNum as String;

  //is 如果物件是指定的型別返回 True
  print(iNum is int);
  Child child;
  Child child1 = new Child();
  print(child is Parent); //child is Null
  print(child1 is Parent);

  //is! 如果物件是指定的型別返回 False
  print(iNum is! int);
複製程式碼
..

級聯操作符
連續呼叫多個函式以及訪問成員變數。
兩個點的級聯語法不是一個操作符。 只是一個 Dart 特殊語法。

 StringBuffer sb = new StringBuffer();
  sb
    ..write('dongnao')
    ..write('flutter')
    ..write('\n')
    ..writeln('damon');
複製程式碼

流程控制語句

  • if else
  • for,forEach,for-in
  • while,do-while
  • break,continue
  • switch case
  • assert
    大部分使用方法都是和Java相同的。
    不同的有
for-in
  var colorList = ['black','red','yellow'];
  for(var i in colorList){
    print(i);
  }
  輸出:
  I/flutter (31601): black
  I/flutter (31601): red
  I/flutter (31601): yellow
複製程式碼
assert

斷言,它可以為程式碼執行設定條件,用於bool條件為false時中斷正常的執行。
assert(condition,optional,message)

  var variable;
  print(variable);
  assert(variable!=null);
  variable = 6;
  print(variable);
  輸出:
   [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter_app/main.dart': Failed assertion: line 50 pos 10: 'variable!=null': is not true.
複製程式碼

最後

這一篇文章,我們詳細的介紹了一下Dart語言的基本語法,瞭解Java的同學,對這些應該不陌生。接下來一篇文章,會對Dart語言繼續進行詳細介紹,讓大家對Dart有一個高階,全面的認識。

Flutter已經是Top20的軟體庫,通過接下來的一系列的文章,希望我和大家一起來學習Flutter,一起進步,一起有所收穫,掌握未來技術主流的主動權!

有什麼好的建議,意見,想法歡迎給我留言!

歡迎關注公共號

關注公眾號會有更多收穫!

image.png
image.png
Dart語言詳解(二)——基本語法

動動小手指點贊,收藏,轉發一鍵三連走一波吧!


相關文章