美文网首页
Flutter学习--dart与oc语法区别

Flutter学习--dart与oc语法区别

作者: 大良造L | 来源:发表于2020-12-14 16:20 被阅读0次

主要记录个人梳理的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);

相关文章

网友评论

      本文标题:Flutter学习--dart与oc语法区别

      本文链接:https://www.haomeiwen.com/subject/sqgvgktx.html