級別: ★☆☆☆☆
標籤:「Dart 」「Dart基礎」「Dart基礎類型」
做者: WYW
審校: QiShare團隊php
前言:
筆者最近看了Flutter相關的內容,而Flutter的基礎庫是由Dart編寫的,因此筆者學習了關於Dart的部份內容,整理了幾篇關於Dart基礎的文章。git
Flutter is Google’s portable UI toolkit for building beautiful, natively-compiled applications for mobile, web, and desktopfrom a single codebase. (引自Flutter.dev) Flutter 是谷歌的便攜式UI工具包,可使用一套代碼庫,來建立漂亮的本地編譯的移動端(iOS、Android)應用,web(瀏覽器中的頁面)、桌面(Mac、Windows、Linux)應用。 Flutter 當前最新穩定版本是1.5。github
Dart([KK] 英語發音:/dɑrt/, [DJ] 英語發音:/dɑ:t/)是一種適用於萬維網的開放源代碼編程語言,由Google主導開發,於2011年10月公開。它的開發團隊由Google Chrome瀏覽器V8引擎團隊的領導者拉爾斯·巴克主持,目標在於成爲下一代結構化Web開發語言。 相似JavaScript,Dart也是一種面嚮對象語言,可是它採用基於類編程。它只容許單一繼承,語法風格接近C語言。web
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.goodev.org/install瀏覽器
在 Mac 安裝 Dart 可查看 : dart.goodev.org/install/macbash
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: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;
複製代碼
通常咱們開始學習某門語言的時候都會先輸出,Hello World!或者是Hello 語言名。 Dart的輸出語句和Swift同樣,都是print
。Dart的語句須要使用分號結尾。
main(){
print('Hello World!');
print('Hello Dart!');
}
// 輸出結果:
/**
Hello World!
Hello Dart!
*/
複製代碼
定義變量使用 關鍵字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');
}
複製代碼
使用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');
複製代碼
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'
}
];
複製代碼
下邊是字符串和整數,浮點數之間的類型轉換。
// 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>
*/
複製代碼
下邊筆者舉了一個說出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技術交流羣》。
關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)
推薦文章:
iOS 短信驗證碼倒計時按鈕
iOS 環境變量配置
iOS 中處理定時任務的經常使用方法
算法小專欄:貪心算法
iOS 快速實現分頁界面的搭建
iOS 中的界面旋轉
奇舞週刊