Dart語法摘要(二)

學Flutter就和學iOS一樣搔确,先學基本語言語法的使用竟秫,再學習搭UI娃惯,iOS是OC和Swift,F(xiàn)lutter么就是Dart肥败,語言學多了語法都差球不多趾浅,特別是這些新的語言,很多東西都是相似的馒稍,但是長時間不用容易忘記皿哨,與其每次去網上瞎jb找,不如自己總結一些纽谒,以后看自己寫的東西就行了证膨。文中個別結論是我自己總結出來的,不能保證準確性鼓黔,看到的同學僅供參考央勒。

本章提綱:
1.函數(shù)
2.函數(shù)的參數(shù)
3.匿名函數(shù)
4.運算符

函數(shù)

1.Dart也是面向對象語言,所以即使函數(shù)也是對象澳化,所有也有類型崔步,函數(shù)的類型就Function,這個和Swift中一樣的哇缎谷,函數(shù)都是一等公民井濒,意味著你可以將函數(shù)作為變量定義或者作為其他函數(shù)的參數(shù)或者返回值。如果函數(shù)中只有一個表達式列林,那么可以使用箭頭語法(arrow syntax)瑞你。

//定義一個函數(shù)
int sum(num num1, num num2) {
  return num1 + num2;
}
//省略返回值的類型依然是可以的
sum(num num1, num num2) {
  return num1 + num2;
}
//注意,這里面只能是一個表達式希痴,不能是一個語句
sum(num1, num2) => num1 + num2;

函數(shù)的參數(shù)

1.函數(shù)的參數(shù)可以分成兩類: 必須參數(shù)可選參數(shù)者甲,必須參數(shù)么就是函數(shù)基本的參數(shù)江醇,可選參數(shù)可以分為命名可選參數(shù)位置可選參數(shù)岗照。

// 命名可選參數(shù)父丰,age和height就是可選參數(shù)
printInfo1(String name, {int age, double height}) {
  print('name=$name age=$age height=$height');
}

// 調用printInfo1函數(shù)
printInfo1('tong'); // name= tong age=null height=null
printInfo1('tong', age: 18); // name= tong age=18 height=null
printInfo1('tong', age: 18, height: 1.88); // name= tong age=18 height=1.88
printInfo1('tong', height: 1.88); // name= tong age=null height=1.88

2.命名可選參數(shù)粪薛, 可以指定某個參數(shù)是必傳的,使用@required標記寇钉,這點在第一次看的時候不是很理解刀疙,因為既然是可選參數(shù)了,為啥又可以要求必傳扫倡,要求必傳直接設為必傳參數(shù)不就行了谦秧,這兩者感覺有點矛盾,后來看官方很多類里面都這么用的撵溃,目前還沒體會到這種用法的優(yōu)勢在哪疚鲤。

補充:看到后面官方文檔有個解釋我覺得還算能說的過去,就是為啥不用必傳參數(shù)是因為在Flutter里很多widget的屬性很多缘挑,如果用必傳參數(shù)調用的時候看不到方法名集歇,不知道傳的是哪個參數(shù),而使用命名可選+@requierd就可以實現(xiàn)既可以看到方法名语淘,方便外部調用诲宇,也可以有必傳參數(shù)的限制了,更多的是方便使用惶翻。

intInfo3(String name, {int age, double height, @required String address}) {
  print('name=$name age=$age height=$height address=$address');
}

3.位置可選參數(shù)姑蓝,調用的時候參數(shù)的順序不能調換。

// 定義位置可選參數(shù)
printInfo2(String name, [int age, double height]) {
  print('name=$name age=$age height=$height');
}

// 調用printInfo2函數(shù)
printInfo2('why'); // name=why age=null height=null
printInfo2('why', 18); // name=why age=18 height=null
printInfo2('why', 18, 1.88); // name=why age=18 height=1.88

4.可選參數(shù)默認值

// 參數(shù)的默認值
printInfo4(String name, {int age = 18, double height=1.88}) {
  print('name=$name age=$age height=$height');
}

函數(shù)是一等公民

上面說過了吕粗,可以把函數(shù)當做其他類型的變量一樣在各個場合使用纺荧。

main(List<String> args) {
  // 1.將函數(shù)賦值給一個變量
  var bar = foo;
  print(bar);

  // 2.將函數(shù)作為另一個函數(shù)的參數(shù)
  test(foo);

  // 3.將函數(shù)作為另一個函數(shù)的返回值
  var func =getFunc();
  func('tong');
}

// 1.定義一個函數(shù)
foo(String name) {
  print('傳入的name:$name');
}

// 2.將函數(shù)作為另外一個函數(shù)的參數(shù)
test(Function func) {
  func('tong');
}

// 3.將函數(shù)作為另一個函數(shù)的返回值
Function getFunc() {
  return foo;
}

匿名函數(shù)

沒有名字的函數(shù)又稱為匿名函數(shù),也可以叫l(wèi)ambda或者closure颅筋,這玩意兒基本每種語言里都有宙暇,叫法不一樣,OC叫block议泵,原理都差不多占贫。

main(List<String> args) {
  // 1.定義數(shù)組
  var movies = ['西游記', '東游記', '南游記', '北游記'];

  // 2.使用forEach遍歷: 有名字的函數(shù)
  printElement(item) {
    print(item);
  }
  movies.forEach(printElement);

  // 3.使用forEach遍歷: 匿名函數(shù)
  movies.forEach((item) {
    print(item);
  });
  movies.forEach((item) => print(item));
}

函數(shù)返回值

所有函數(shù)都返回一個值。如果沒有指定返回值肢簿,則隱式返回null附加到函數(shù)體。

運算符

基本的+-*/和其他語言一樣蜻拨,主要記錄一下Dart特有的幾個運算符池充。
1.整除運算~/

var num = 7;
print(num ~/ 3); // 整除操作, 結果2;

2.??=賦值操作
當變量為null時,使用后面的內容進行賦值缎讼。當變量有值時收夸,使用自己原來的值。

main(List<String> args) {
  // var name2 = 'tong';
  var name2 = null;
  name2 ??= 'chao'; 
  print(name2); // 當name2初始化為tong時血崭,結果為tong卧惜,當初始化為null時厘灼,賦值了chao
}

3.條件運算符??
expr1 ?? expr2,如果expr1null咽瓷,則返回expr2的結果设凹;如果expr1不是null,直接使用expr1的結果茅姜。

var temp = 'why';
var temp = null;
var name = temp ?? 'kobe';
print(name);

4.級聯(lián)語法:..
可以對一個對象進行連續(xù)的操作闪朱。除了調用函數(shù),還可以訪問同一對象上的字段屬性钻洒。 這通撤茏耍可以節(jié)省創(chuàng)建臨時變量的步驟,同時編寫出更流暢的代碼素标。

main(List<String> args) {
  final p1 = Person();
  p1.name = 'tong';
  p1.run();
  p1.eat();
  p1.swim();

  //級聯(lián)語法
  final p2 = Person()
              ..name = "tong"
              ..run()
              ..eat()
              ..swim();
}

5.類型判定運算符
as称诗,is,和 is! 運算符用于在運行時處理類型檢查头遭。is運算符判斷對象是否為某種類型寓免,as 運算符將對象強制轉換為特定類型。

if (emp is Person) {
  // Type check
  emp.firstName = 'Bob';
}
(emp as Person).firstName = 'Bob';

如果empnull或者不是Person對象任岸, 那么第一個is的示例再榄,后面將不回執(zhí)行; 第二個as的示例會拋出異常享潜。
6.?.取值操作
使?.來代替.困鸥,可以避免因為左邊對象可能為null,導致的異常:

// 如果 p 為 non-null剑按,設置它變量 y 的值為 4疾就。
p?.y = 4;

運算符重寫

有的語言里叫運算符重載,都是為原來不支持這種操作的數(shù)據類型賦予這種運算的能力艺蝴,方便使用猬腰。這玩意兒OC也沒有,古老特點之三猜敢。
重載時需要用到operator這個關鍵字姑荷,后面跟上要重載的運算符,下面就舉個簡單的+-重載的例子缩擂,其他的用法還蠻多鼠冕,==的重載還要涉及到hashisEqual吧,這個應該所有語言都差不多胯盯,具體的可以去網上專門搜一下懈费,貼個
傳送門,這具體用到的時候再細看吧博脑。

class Vector {
  final int x, y;

  Vector(this.x, this.y);

  Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
  Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
}

流程控制

1.for循環(huán)
除了基本的for-i和for-in循環(huán)之外憎乙,Dart對于實現(xiàn)了Iterable 接口的對象提供了forEach() 方法票罐,如果不需要使用當前計數(shù)值, 使用 forEach() 是非常棒的選擇泞边。

candidates.forEach((candidate) => candidate.interview());

2.switch-case
每個case結尾需要加break该押,空case可以穿透,在非空case中實現(xiàn)fall-through形式繁堡,可以使用continue語句結合lable的方式實現(xiàn):

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // Continues executing at the nowClosed label.

  nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

參考資料:
coderwhy-Flutter之搞定Dart系列
Dart編程語言中文網

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沈善,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椭蹄,更是在濱河造成了極大的恐慌闻牡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绳矩,死亡現(xiàn)場離奇詭異罩润,居然都是意外死亡,警方通過查閱死者的電腦和手機翼馆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門割以,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人应媚,你說我怎么就攤上這事严沥。” “怎么了中姜?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵消玄,是天一觀的道長。 經常有香客問我丢胚,道長翩瓜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任携龟,我火速辦了婚禮兔跌,結果婚禮上,老公的妹妹穿的比我還像新娘峡蟋。我一直安慰自己坟桅,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布蕊蝗。 她就那樣靜靜地躺著仅乓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匿又。 梳的紋絲不亂的頭發(fā)上方灾,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天建蹄,我揣著相機與錄音碌更,去河邊找鬼裕偿。 笑死,一個胖子當著我的面吹牛痛单,可吹牛的內容都是我干的嘿棘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼旭绒,長吁一口氣:“原來是場噩夢啊……” “哼鸟妙!你這毒婦竟也來了?” 一聲冷哼從身側響起挥吵,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤重父,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后忽匈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體房午,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年丹允,在試婚紗的時候發(fā)現(xiàn)自己被綠了郭厌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡雕蔽,死狀恐怖折柠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情批狐,我是刑警寧澤扇售,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贾陷,受9級特大地震影響缘眶,放射性物質發(fā)生泄漏。R本人自食惡果不足惜髓废,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一巷懈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慌洪,春花似錦顶燕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至频伤,卻和暖如春恳谎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工因痛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婚苹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓鸵膏,卻偏偏與公主長得像膊升,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谭企,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容