Dart基礎(一)

QiShare發表於2019-07-04

級別: ★☆☆☆☆
標籤:「Dart 」「Dart基礎」「Dart基礎型別」
作者: WYW
審校: QiShare團隊


前言:
筆者最近看了Flutter相關的內容,而Flutter的基礎庫是由Dart編寫的,所以筆者學習了關於Dart的部分內容,整理了幾篇關於Dart基礎的文章。

Flutter 、Dart簡介

Flutter is Google’s portable UI toolkit for building beautiful, natively-compiled applications for mobileweb, and desktopfrom a single codebase. (引自Flutter.dev) Flutter 是谷歌的行動式UI工具包,可以使用一套程式碼庫,來建立漂亮的本地編譯的移動端(iOS、Android)應用,web(瀏覽器中的頁面)、桌面(Mac、Windows、Linux)應用。 Flutter 當前最新穩定版本是1.5。

Dart([KK] 英語發音:/dɑrt/, [DJ] 英語發音:/dɑ:t/)是一種適用於全球資訊網的開放原始碼程式語言,由Google主導開發,於2011年10月公開。它的開發團隊由Google Chrome瀏覽器V8引擎團隊的領導者拉爾斯·巴克主持,目標在於成為下一代結構化Web開發語言。 類似JavaScript,Dart也是一種面嚮物件語言,但是它採用基於類程式設計。它只允許單一繼承,語法風格接近C語言。

Dart is a client-optimized language for fast apps on any platform Dart是客戶端的優化過的語言,可用於在任何平臺(包括移動端(iOS、Android)、Web頁面、桌面(Mac、Windows、Linux)應用),來建立執行流暢的應用。

當前Dart最新版本是2.4.0,2019-06-27 Dart開發團隊釋出2.4.0版本Dart。 Dart change log

下邊,我們聊一下,關於Dart安裝,及檢視程式碼執行效果的內容

安裝Dart

Dart 安裝方式可檢視:dart.goodev.org/install

在 Mac 安裝 Dart 可檢視 : dart.goodev.org/install/mac

線上演示Dart執行效果

DartPad:Dart 線上演示:dartpad.dartlang.org

DartPad, an open-source tool, allows you to play with the Dart language features in any modern browser.

DartPad 是一個開源工具,我們可以在現代瀏覽器中使用DartPad來演示Dart語言特性。 筆者的理解就是,我們可以用DartPad線上檢視Dart程式設計效果。

下邊我們聊一下,Dart的基礎語法相關的內容。

Dart匯入標頭檔案(資源庫)的方式

// dart:io 為非Web應用提供檔案,Socket,HTTP,和其他IO支援。
import 'dart:io';

// 匯入Android設計風格的material庫
import 'package:flutter/material.dart';

// 匯入iOS 的設計風格cupertino庫
import 'package:flutter/cupertino.dart';

// 只匯入material庫中的AppBar
import 'package:flutter/material.dart' show AppBar;

// 匯入除了material庫中 除BottomNavigationBar之外 的內容
import 'package:flutter/material.dart' hide BottomNavigationBar;
複製程式碼

Dart基本語法

  • 1. 輸出語句

一般我們開始學習某門語言的時候都會先輸出,Hello World!或者是Hello 語言名。 Dart的輸出語句和Swift一樣,都是print。Dart的語句需要使用分號結尾。

main(){
  print('Hello World!');
  print('Hello Dart!');
}


// 輸出結果:
/**

Hello World!
Hello Dart!

*/

複製程式碼
  • 2. 變數

定義變數使用 關鍵字var; 如定義變數名為name,值為QiShare的變數。

  var name = 'QiShare';
  print(name);

// 輸出結果:
//  QiShare
複製程式碼

Dart變數預設值為null

  int fansCount;
  //   String fansCount;
  if (fansCount == null) {
    print('null');
  } else {
    print('not null fansCount ${fansCount}');
  }

// 輸出結果:
  /**
  null
  */
  
複製程式碼

輸出變數,需要拼接字串和變數一起輸出的情況下,所有的內容都使用''包起來

${變數} 可以用於訪問相應的變數的值。

取變數值是否使用{} 分情況:

  • 1.直接訪問例項的情況 直接使用 $例項 即可;

  • 2.訪問例項的成員變數的情況 需要使用 ${例項.變數} ;

  • 3.只是單純輸出例項或者是例項的成員變數的情況,不需要使用$。

  • 3. 字串 字串拼接及多行字串

	// 字串拼接
	var name = 'QiShare' + 'QiShare';
	print(name);
  
	// 輸出結果:
	// QiShareQiShare
  
	// 多行字串
	var name = '''
	QiShare
	QiShare
	QiShare
  ''';
  print(name);
  
  // 輸出結果:
  /**
  QiShare
  QiShare
  QiShare
  */
  
複製程式碼

關於變數是否對外可訪問,在iOS Objective-C裡邊,如果我們想類檔案A的某個變數對外可見,可以在類A.h檔案裡邊把變數宣告為屬性。然後只要引用了A.h的類,就能夠訪問A.h中宣告的屬性。

在Dart中,如果要指定某個變數對外可訪問,可以在類檔案的頂部宣告變數。

  • 如果想要指定某個類的例項變數對外可訪問,直接寫在類宣告的內部即可。並且變數不要使用下劃線開頭。

  • 對於私有的變數,或者方法,使用下劃線 “_” 在變數、方法前,則該變數、方法將分別為私有變數、私有方法。

  • 對於其他的多個常量,整個專案中使用的情況,可以單獨建立一個類檔案用於存放公共的常量。

  • 4. 變數型別檢查及值檢查

開發過程中,在對服務端下發的資料,進行處理的時候,有時需要進行變數型別判斷,值的檢測。可以參考如下的2種檢測方式。

一個是變數型別檢查,使用runtimeType或者使用關鍵字is進行型別檢測; 另一個是變數的值的檢查

變數型別檢查

  // runtimeType是用於檢視變數型別的。
  // 可以使用runtimeType或is檢視變數是什麼型別
  
  String QiShare = 'QiShare';
  if (QiShare.runtimeType == String) {
    print(QiShare);
    print('name:${QiShare}');
  }
  

/**
QiShare
name:QiShare
*/


// 使用is 檢視變數的型別
String QiShare = 'QiShare';
  if (QiShare is String) {
    print('是String型別 :');
    print(QiShare);
  } else {
    print('非String型別');
  }
/* 輸出結果:
是String型別 : QiShare
*/
複製程式碼

變數的值的檢查

// Check for an empty string.
var fullName = '';
if (fullName.isEmpty) {
  print('空字串');
}

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
if(hitPoints <= 0) {
	print('hitPoints小於等於0');
}

// Check for null.
var unicorn;
if (unicorn == null) {
	print(null);
}

// Check for NaN. The global NaN property is a value representing Not-A-Number.
var iMeantToDoThis = 0 / 0;
if (iMeantToDoThis.isNaN) {
	print('Not a number');
}

複製程式碼
  • 5. 型別推導

使用var 宣告的變數,通過輸出變數的runtimeType ,可以發現變數的型別可以通過賦給變數的值,自動進行型別推導。

  var name = 'QiShare';
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  
  
/**

QiShare
String

*/

  var name = 10.0;
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  name = 10.1;
  
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  
  /**
	10
	int
	10.1
	double
  */

/*
上邊的例子很有意思,推匯出的10.0的型別為int;
推匯出的10.1的型別為double。
筆者認為是編譯器做了優化,具體怎麼做的,筆者尚不清楚。
*/
  
複製程式碼

當然除了型別推導知道變數的型別外,對於我們自己宣告的變數,在已經確定變數型別的情況下,直接直觀地宣告變數型別即可。

那麼對於var 這種變數的使用場景,筆者想到的有如下2種情況。

  • 1.接收服務端返回資料的時候,避免返回的資料型別和預期的有差異的情況,可以使用var 變數接收,然後通過型別檢測後,再進一步進行資料地處理;

  • 2.對於某些函式接收的引數可能是多種型別的情況下,使用var 來修飾引數型別。

  • 6. Final and const

final 宣告的變數只能賦值一次
final name = 'QiShare';
// name = 'QiShareQiShare';
// 報錯:
const 是編譯時常量
const name = 'QiShare'
複製程式碼

final 或const修飾的變數只能賦值一次;

const 變數是編譯時常量,在編譯的時候,我們就已經知道了const 變數的值。

頂級的final 變數或類中的final變數在第一次使用的時候初始化。

這裡舉一個類中final變數初始化的例子:

class QiShareMember {
  final String memberID;
  final String memberName;
  QiShareMember(this.memberID, this.memberName);
}

// QiShareMember初始化例項
QiShareMember member = QiShareMember('id', 'name');


複製程式碼
  • 7. List和Map
  var list = ['a', 'b', 1];

  // 遍歷list
  list.forEach( (object){
     print('型別 ${object.runtimeType}');
     print('值${object}');
   }
  );

  // list 中的資料
  print(list.length);
              
/**
              
CONSOLE
型別 String
值a
型別 String
值b
型別 int
值1
*/



void main() {
  var gifts = {
// Keys      Values
  'first' : 'partridge',
  'second': 'turtledoves',
  'fifth' : 'golden rings'
};
  
  print(gifts);
  // 獲取Map中的鍵值對數目
  print(gifts.length);
  
  // 遍歷字典
  gifts.forEach(
  	(key, value){
      print('key:${key}');
      print('value:${value}');
    }
  );
  
  /**
  
CONSOLE
{first: partridge, second: turtledoves, fifth: golden rings}
key:first
value:partridge
key:second
value:turtledoves
key:fifth
value:golden rings

  */

複製程式碼

List相當於是Swift的陣列;List的使用場景有:用於放置UI層面的列表資料寬泛內容; Map相當於Swift的字典;Map的使用場景有:用於放置UI層面的列表資料中更具體內容;

舉個例子: 比如說 如下的資料,根據List中的字典的個數可以確定,UI層面上,需要展示5個人的資訊; 進一步根據List中,每一個字典中的name,和avatarUrl 可以確定更加細緻的UI層面,每個人的個人資訊的名字(name的值)和頭像(avatarUrl 對應的圖片)應該顯示什麼。

[
  {'name':'QiShare1',
  'avatarUrl':'https://www.so.com....jpg'
},
 
  {
  'name':'QiShare2',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare3',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare4',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare5',
  'avatarUrl':'https://www.so.com....jpg'
}


];
複製程式碼
  • 8. 資料型別轉換

下邊是字串和整數,浮點數之間的型別轉換。

 // String -> int String 型別轉換為int 型別
var one = int.parse('1');
 print(one.runtimeType);

// String -> double String 型別轉為double型別
var onePointOne = double.parse('1.1');
  print(onePointOne.runtimeType);

// int -> String int 型別轉換為String
String oneAsString = 1.toString();
print(oneAsString.runtimeType);

// double -> String double型別轉換為String型別
String piAsString = 3.14159.toStringAsFixed(2);
print(piAsString.runtimeType);

/**

int
double
String
String
*/


// List型別轉換 把子型別為dynamic的List轉換為更為具體的子型別為String的List

  List<dynamic> dynmicList = ['QiShare', 'QiShare'];
  print(dynmicList.runtimeType);
  
  List<String>strList = List<String>.from(dynmicList);
  print(strList);
  print(strList.runtimeType);
  

  /**
  
JSArray
[1, 2]
JSArray<String>
  */
  
複製程式碼
  • 9.方法

下邊筆者舉了一個說出QiShare 年齡的方法。

 int qiAgeNum = qiAgeNumber();
 qiSay('${words()} ${qiAgeNum}');

// 返回值為String型別,引數為空,名為words方法。
String words(){
  return 'QiShare Age:';
}

// 返回值為空型別,引數為String,名為qiSay的方法。
void qiSay(String words) {
  print(words);
}

// 返回值為空,引數為空的,名為qiSay方法。
void qiAge() {
  print(qiAgeNumber());
}

// 返回值為int,引數為空,名為qiAgeNumber 的方法。
int qiAgeNumber (){
  return 1;
}

/**

// 輸出結果
QiShare Age: 1

*/

複製程式碼

參考學習資料


小編微信:可加並拉入《QiShare技術交流群》。

Dart基礎(一)

關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)

推薦文章:
iOS 簡訊驗證碼倒數計時按鈕
iOS 環境變數配置
iOS 中處理定時任務的常用方法
演算法小專欄:貪心演算法
iOS 快速實現分頁介面的搭建
iOS 中的介面旋轉
奇舞週刊

相關文章