级别: ★☆☆☆☆
标签:「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 中的界面旋转
奇舞周刊