1,一般而言,当我们定义一个字符串的时候,字符串要用单引号或者双引号括起来,单引号或者双引号的作用是一样的,如下:
String str1 = '单引号';
String str2 = "双引号";
当字符串有换行需求的时候,我们可以用\n来代表一个换行符,如下:
String str1 = '单引号\n这是第二行了';
print(str1);
打印结果如下:
单引号
这是第二行了
但是有没有一个更加可视化的定义可换行的字符串的方案呢,比如像下面这样直接换行:
String str2 = "双引号
这是第二行了";
print(str2);
运行之后我们发现,程序报错了。
其实,在Dart中,除了单引号和双引号,还可以用三引号(即三个单引号或者三个双引号)来修饰字符串。使用三引号修饰的字符串可以直接换行,如下所示:
String str2 = '''双引号
这是第二行了''';
print(str2);
运行之后打印结果如下:
双引号
这是第二行了
2,Dart中的数组是List,字典是Map,可以通过is关键字来判断变量的类型,如下所示:
var map2 = new Map();
map2['name'] = '李四';
map2['age'] = 29;
map2['work'] = ['程序员', '登山运动员'];
print(map2);
if (map2 is Map) {
print('map');
}
3,Dart中的加减乘除取余,与oc中一致,但是多出了一个~/运算符:两者相除取整。代码如下:
double a = 13.14;
int b = 520;
var f = b/a;
print(f);
var h = b~/a;
print(h);
打印结果如下:
39.5738203957382
39
4,??=运算符。
double c;
c = 11;
c ??= 23;
print(c);
上面代码的打印结果是:
11.0
为什么不是23呢?因为c ??= 23;这行代码的意思是:如果c为空,那么就将23赋值给c。上例中,在执行c ??= 23;这行代码之前,c就已经被赋值为11,所以最终打印结果是11。
5,??运算符。
void main(){
var a = 13.14;
var b;
print(a ?? 111);
print(b ?? 222);
}
打印结果如下:
13.14
222
a ?? 111这行代码的意思是:判断a的值是否为空,如果为空则这行代码的值为111;如果a值不为空,则这行代码的值是a的值。
6,未赋值的变量。
当一个变量未被赋值的时候,它是null。
String str;
print(str);
int a;
print(a);
print(a==0);
print(a==null);
打印结果如下:
null
null
false
true
该例中,字符串str和数值a均未被赋值,所以其打印结果均为null。
在OC中,如果一个int类型的变量未被初始化,那么默认值为0,但是在Dart中,如果一个int类型的变量未被赋值,那么其值为null,不是0。
7,While和Do-While的区别。
var i = 10;
while (i<8) {
print('单身狗');
}
do {
print('幸福美满');
} while (i<8);
打印结果如下:
幸福美满
while循环是先判断再执行;do-while循环是先执行一次,再判断。
8,break和continue
break可以用在switch-case中,也可以用在for循环和while循环中;
在switch-case中使用break,可以使流程跳出switch结构;
在循环结构中使用break,可以使流程跳出当前循环(遇到break,循环就终止,本次循环体接下来的代码也不会执行);
在多层循环中,一个break语句只能向外跳出一层。
continue只能用在循环语句中;
continue的作用是使本次循环体结束,即跳过本次循环体中尚未执行的语句,然后进入下次是否执行循环的判断。
9,List中的常用属性和方法。
List mylist = ['111'];
mylist.add('222');
mylist.add('333');//给数组增加元素
mylist.addAll(['444', '555']);//用于拼接数组
print(mylist.reversed.toList());//对列表倒序排序,并转为List
print(mylist.isEmpty);//列表是否为空
print(mylist.isNotEmpty);//列表是否为非空
print(mylist.indexOf('5575'));//查找数据,找到的话会返回对应的索引值,查找不到就返回-1
mylist.remove('111');//删除对应的元素
mylist.removeAt(0);//通过对应元素的索引值删除
mylist.fillRange(1, 3, '666');//修改相应的元素值
mylist.insert(1, '777');//插入一个元素
mylist.insertAll(3, ['888', '999']);//插入多个元素
print(mylist.join(','));//将List转成字符串String,各个元素间用,分割
var listStr = '1,2,3,4,5,6,7,8,9,10';
print(listStr.split(','));//将String字符串分割成List数组,分隔符是,
10,Set
Set与List的不同之处在于:Set中元素不可重复,而List中元素可以重复;Set中元素无序,List中元素是有序的。
一般使用Set来对List中的元素去重:将List转成Set,这样获取到的集合的元素就没有重复的了。
11,Map的相关属性和方法
var person = {
'name':'拉维',
'age':29,
'job':'程序员'
};
print(person.keys.toList());//获取到字典中的所有key
print(person.values.toList());//获取字典中的所有value
print(person.isEmpty);//是否为空
print(person.isNotEmpty);//是否不为空
person.addAll({
'height':176,
"weight":126
});//增加元素
person.remove('height');//删除对应元素
print(person.containsKey('height'));//查看有没有对应的key
print(person.containsValue(126));//查看有没有对应的value
12,循环遍历List的几种方式。
List mylist = [1, 2, 3, 4, 5, 6, 7, 8];
//for循环
for (var i = 0; i < mylist.length; i++) {
print(mylist[i]);
}
//for-in循环
for (var a in mylist) {
print(a);
}
//forEach循环遍历集合的每个元素
mylist.forEach((value){
print(value);
});
//map方法用于遍历处理每一个元素
var newlist = mylist.map((value){
//给集合中的每一个值乘以2
return value*2;
});
print(newlist.toList());
//where用于遍历每一个元素并返回满足判断条件的元素
var newlist2 = mylist.where((value){
//这里是判断条件
return value>6;
});
print(newlist2);
//遍历集合的所有元素,只要有任何一个元素符合判断条件,结果就是true;当所有元素都不符合判断条件的时候,才会返回fault
bool result1 = mylist.any((value){
//这里是判断条件
return value > 7;
});
print(result1);
//遍历集合的所有元素,当每一个元素都满足判断条件的时候才会返回true,有一个元素不满足条件就会返回fault
bool result2 = mylist.every((value){
//这里是判断条件
return value>0;
});
print(result2);
虽然这里是以List举例演示,但是对于Set、List以及Map这三种几何形式,以上方法都适用。比如,下面是使用forEach方法来循环Map:
Map person={
"name":"张三",
"age":20
};
person.forEach((key, value){
print('$key---$value');
});
以上。
本文分享自微信公众号 - iOS小生活(iOSHappyLife)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4581368/blog/4372515