主要记录个人梳理的dart语法与oc的区别
1、字典、map的key-value可以是任意类型
2、
fucA(element) {
print(element);
}
list.forEach(fucA) // 遍历数组
3、
// [] 为可选参数
String say(String from, String msg,
[String device = 'carrier pigeon', String mood]) {} 。
4、
// 等价 if(xxx) { xxx } 。 对于只有一个表达式的方法,可以选择使用缩写语法来定义
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
5、 匿名方法 (xxx){}
var list = ['apples', 'oranges', 'grapes', 'bananas', 'plums'];
list.forEach((obj) {
print(list.indexOf(obj).toString() + ': ' + obj);
});
缩略为:
list.forEach((i) => print(list.indexOf(i).toString() + ': ' + i));
6、is 关键字判断是否此类型
7、as 类型转换
如:(emp as Person).firstName = 'Bob';
8、??= 操作符用来指定 值为 null 的变量的值。
如:b ??= value; // 如果 b 是 null,则赋值给 b;// 如果不是 null,则 b 的值保持不变
如:
String toString() => msg ?? super.toString();
等价于:
String toString() => msg == null ? super.toString() : msg;
9、Cascade notation (..)(级联操作符)
如:
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
等价于:
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
10、 ?. 左边的操作对象不能为 null,例如 foo?.bar 如果 foo 为 null 则返回 null,否则返回 bar 成员, 与 ?: 是有区别的
11、循环
where:
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
// 上面的代码可以使用下面的写法:
candidates.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
12、a.runtimeType 判断实例的类型
13、构造函数,类似initWithxxx
class Point {
num x;
num y;
Point(this.x, this.y);
// Named constructor
Point.fromJson(Map json) {
x = json['x'];
y = json['y'];
}
}
等价于 -initWithPoint: -initWithFromJson 2个方法
14、操作符的覆写,如覆写 + 和 - 来实现2个向量的相加
class Vector {
final int x;
final int y;
const Vector(this.x, this.y);
Vector operator +(Vector v) {
return new Vector(x + v.x, y + v.y);
}
Vector operator -(Vector v) {
return new Vector(x - v.x, y - v.y);
}
}
main() {
final v = new Vector(2, 3);
final w = new Vector(2, 2);
assert(v.x == 2 && v.y == 3);
assert((v + w).x == 4 && (v + w).y == 5);
assert((v - w).x == 0 && (v - w).y == 1);
}
15、抽象类
使用 abstract 修饰符定义一个 抽象类—一个不能被实例化的类。 抽象类通常用来定义接口, 以及部分实现。如果你希望你的抽象类 是可示例化的,则定义一个 工厂 构造函数。
如:
abstract class AbstractContainer {
void updateChildren(); // Abstract method.
}
16、隐式接口
每个类都隐式的定义了一个包含所有实例成员的接口, 并且这个类实现了这个接口。如果你想 创建类 A 来支持 类 B 的 api,而不想继承 B 的实现, 则类 A 应该实现 B 的接口。
一个类可以通过 implements 关键字来实现一个或者多个接口, 并必须实现每个接口定义的 API。
class Person {
final _name;
Person(this._name);
String greet(who) => 'Hello, $who. I am $_name.';
}
class Imposter implements Person {
final _name = "";
String greet(who) => 'Hi $who. Do you know who I am?';
}
greetBob(Person person) => person.greet('bob');
main() {
print(greetBob(new Person('kathy')));
print(greetBob(new Imposter()));
}
17、Mixins 是一种在多类继承中重用 一个类代码的方法 类似是用Protocol去实现多继承
18、延迟加载,可以让应用在需要的时候再 加载库
如:
import 'package:deferred/hello.dart' deferred as hello;
greet() async {
await hello.loadLibrary(); // 此时才加载库,await 关键字暂停代码执行一直到库加载完成
hello.printGreeting();
}
19、call() , 如果 Dart 类实现了 call() 函数则 可以当做方法来调用。
如:
class WannabeFunction {
call(String a, String b, String c) => '$a $b $c!';
}
main() {
var wf = new WannabeFunction();
var out = wf("Hi","there,","gang");
print('$out');
}
20、typedef 定义方法类型别名,如果我们使用显式的名字并保留类型信息, 开发者和工具可以使用 这些信息
如:
typedef int Compare(Object a, Object b);
class SortedCollection {
Compare compare;
SortedCollection(this.compare);
}
21、final变量在第一次使用时被初始化、const 变量是一个编译时常量,
22、dynamic类似于OC的id
23、类型转换:
int.parse(‘1’)
num.parse('42')
数字转字符串
42.toString()
123.456.toStringAsFixed(2) // 2位小数
json串转字典
JSON.decode(jsonString);
字典串转json串
JSON.encode(dict);
24、字符串
// 字符串搜索
assert('Never odd or even'.contains('odd'));
assert('Never odd or even'.startsWith('Never'));
assert('Never odd or even'.endsWith('even'));
assert('Never odd or even'.indexOf('odd') == 6);
// 删除前面空格
assert(' hello '.trim() == 'hello');
// StringBuffer 来创建字符串
var sb = new StringBuffer();
sb..write('Use a StringBuffer for ')
..writeAll(['efficient', 'string', 'creation'], ' ')
..write('.');
var fullString = sb.toString();
assert(fullString ==
'Use a StringBuffer for efficient string creation.');
25、数组
List.add(‘1’)
List.addAll([,,]) // 添加另一个数组
list.indexOf(‘a’) // 元素在数组中的位置
list.removeAt(1) 删除位置为1的元素
list.clear() // 删除所有元素
List.contains()
List.containsAll([,,,]) // 元素是否在数组中
// 数组排序
var fruits = ['bananas', 'apples', 'oranges'];
fruits.sort((a, b) => a.compareTo(b)); // 升序
26、Set集合
set1.intersection(set2) // 两个集合的交集
27、map
map.containsKey(‘key’) // 判断key是否存在,而不是通过value是否为null判断,因为value可以为null。
putIfAbsent // 与put 不一样, 如果存在重复的key,那么putIfAbsent不会放入值。
// 对于Iterable的判断条件: Iterable 可迭代遍历的对象
//where() 函数可以返回所有满足特定条件的数据。 any() 判断是否有数据满足特定条件, every() 判断是否所有数据都满足 特定条件
28、URI 对象: 处理url的编解码功能
Uri.encodeFull // Uri.decodeFull 部分字符的编码解码
Uri.encodeComponent // Uri.decodeComponent 所有字符的编码解码
// 解析:
Uri.parse('http://example.org:8080/foo/bar#frag');
Uri.scheme / host / path / fragment / origin
// 构造:
uri = new Uri(scheme: 'http', host: 'example.org',
path: '/foo/bar', fragment: 'frag');
29、IO库:
import 'dart:io';
var config = new File('config.txt');
contents = await config.readAsString(); // 内容转字符串
contents = await config.readAsLines(); // 转行数
contents = await config.readAsBytes(); // 数据转字节流
// 一点点读取文件
var config = new File('config.txt');
Stream<List<int>> inputStream = config.openRead();
var lines = inputStream.transform(UTF8.decoder).transform(new LineSplitter());
await for (var line in lines) {
print('Got ${line.length} characters from stream');
}
// 写入文件:
var logFile = new File('log.txt');
var sink = logFile.openWrite();
sink.write(‘写入内容’);
sink.close();
// 在文件末尾追加内容:
logFile.openWrite(mode: FileMode.APPEND);
网友评论