声 明
本教程仅用于初学SWIFT同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用SWIFT版本为2.0。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。PAEA.CN版权所有。
大家好,欢迎回到和屌丝一起学SWIFT系列教程中来,上节我们说到了字符串和字符,大家有没有好好练习啊,是不是很简单啊.那么这节我们就来说一说另一个比较常用的东西-集合.
在SWIFT中,一共有3种集合表现形式,数组(Array)集合(Sets)字典(Dictionaries).其中数组是有序集,而集合和字典都是无序的,具体的我们代码中体现.
[数组]
数组是我们大家最常见的,因为他再任何语言中都存在,只是有些语言中的使用方法不一致. 在SWIFT中,同纬数组只能存放指定的类型数据.
(数组)
[创建一个空数组]
创建一个空数组只要定义好一个变量,然后指定一个类型即可.
var a = [Int]();
[创建一个有初始值的数组]
创建一个有初始值的数组需要提供一定的初始值,而且这些初始值还要是同一个类型的数据否则会报错.由于有数据,所以可以不指定类型,让SWIFT自己去检测数据类型
直接创建数组
var a=[1,2,3,4]; //整形数组
var c=["北","京","欢","迎","你"];//字符串数组
指定类型创建数组
var b: [Int]=[1,2,3,4]; //整形数组
使用初始值创建数组
var d = [String](count: 3, repeatedValue:"项目");
//等同于 var d=["项目","项目","项目"];
使用已经存在的2个数组相加得到新的数组
var e=a+b;
//等同于 var e=[1,2,3,4,1,2,3,4]
不同的数据类型不能创建数组
但是如果你这样创建
var f=[1,2,3,"你好"];
你会发现并没有报错,这是为什么呢?我们来试验一下
print(f[1]+f[2]);//错误,无法计算
这回可以确定,SWIFT已经把前面的数字转换成字符串了,那么我们再试一下
var a=[1,2,3,4]; //整形数组
a.append("你好"); //报错
因为a是一个整形数组,我们往里面加入字符串,类型不符,报错
[数组的长度]
我们可以直接使用数组的count属性来获取数组的长度.
var a=[1,2,3,4];
print(a.count); //输出:4
[判断为空]
我们可以使用isEmpty来判断一个数组是不是空数组,当然你也可以使用count来判断,不过这个方法更直接.
var a=[Int]();
if(a.isEmpty){
print("数组是空的");
}else{
print("数组不是空的");
}
输出"数组是空的"
[添加新数据]
使用append方法可以往一个数组里添加数据.
var a=[1,2,3,4];
a.append(5);
for i in a{
print(i);
}
输出:12345
TIP:不能向数字中添加不同类型的数据
a.append("你好"); //报错
我们还可以使用+=号来往数组里添加新数据.
var a=[1,2,3,4];
a+=[5];
for i in a{
print(i);
}
输出:12345
[获取数据]
获取数据可以直接使用下标法或遍历法来实现
下标法
var a=[1,2,3,4];
print(a[0]); //输出1
遍历法看上面的for..in代码
[修改数据]
直接指定数组的下标然后赋值新值即可.
var a=[1,2,3,4];
a[0]=5;
for i in a{
print(i);
}
输出:5234
一次性修改多个数据
var a=[1,2,3,4,5];
a[0...3]=[4,3,2,1];
for i in a{
print(i);
}
输出,43215
使用insert(数据,索引位置)方法在指定的位置插入数据
var a=[1,2,3,4];
a.insert(5, atIndex: 2);
for i in a{
print(i);
}
输出12534
使用removeAtIndex()方法删除指定索引位置的数据,并返回删除的数据,并自动用后面的数据填补,如果你不需要删除的数据,就不用保存了.
var a=[1,2,3,4];
a.removeAtIndex(1);
for i in a{
print(i);
}
输出134
可以使用removeLast()方法直接删除最后一位
var a=[1,2,3,4];
a.removeLast();
for i in a{
print(i);
}
输出123
可以使用removeFirst()方法直接删除最前一位,如果给removeFirst()方法传入一个数字,则会删除前面指定的位数.
var a=[1,2,3,4];
a.removeFirst(2);
for i in a{
print(i);
}
输出34
[集合]
集合(Set)用来存储相同类型并且没有确定顺序的值,集合与数组一样只能保存同一种类型的数据
(集合)
[创建一个空集合]
var a=Set();
[创建一个含有初始值的集合]
var a:Set=[1,2,3,4]; //指定类型创建集合
var b:Set=[5,6,7,8]; //自动推断类型创建集合
var c:Set=["中国","北京","海淀"];
var d:Set=["美国","旧金山","第五大道"];
[获取集合的长度]
我们使用Set的count属性来获取集合的长度.
var a:Set=[1,2,3,4];
print(a.count); //输出4
[判断集合是否为空]
和数组一样,集合也有一个isEmpty属性,可以快速判断这个集合是不是空集合
var a:Set=[1,2,3,4];
if(a.isEmpty){
print("这是一个空集合");
}else{
print("这不是一个空集合");
}
输出"这不是一个空集合"
[添加新元素]
我们通过insert方法来给一个集合添加新的元素,这里注意,集合不支持+=方式添加元素哦
var a:Set=[1,2,3,4];
a.insert(5);
for i in a{
print(i);
}
输出52314
为什么是乱的呢?废话,都和你说了,Set集合是无序的,当然是乱的.
[删除一个元素]
我们使用remove方法来删除一个集合里的值
var a:Set=[1,2,3,4];
a.remove(1);
for i in a{
print(i);
}
输出234,1已经被我干掉了
当然我们也可以使用清理门户方法-removeAll()来一次性清空
var a:Set=[1,2,3,4];
a.removeAll();
if a.count>0{
print("还有活着的");
}else{
print("都死光光了");
}
输出"都死光光了"
[检测值]
集合还有一个contains方法可以让我们去直接检测里面是不是含有特定的一个值
var a:Set=[1,2,3,4];
if a.contains(2) {
print("恩,你2");
}else{
print("恩,你不2");
}
输出"恩,你2"
[遍历集合]
集合的遍历方法和数组一样使用for...in的方法
var a:Set=[1,2,3,4];
for i in a{
print(i);
}
输出"2314"
[求交集]
集合可以使用intersect()方法直接用2个集合创建一个交集集合
var a:Set=[1,2,3,4];
var b:Set=[3,4,5,6];
var c:Set=a.intersect(b);
for i in c{
print(i);
}
输出34
[求差集]
集合可以使用exclusiveOr()方法直接用2个集合创建一个差集集合
var a:Set=[1,2,3,4];
var b:Set=[3,4,5,6];
var c:Set=a.exclusiveOr(b);
for i in c{
print(i);
}
输出5621
[合并集合]
可以使用union()方法来合并2个集合,并去除重复值
var a:Set=[1,2,3,4];
var b:Set=[3,4,5,6];
var c:Set=a.union(b);
for i in c{
print(i);
}
输出123456
[排除集合]
可以使用subtract()方法来使一个集合排除另一个集合里的值
var a:Set=[1,2,3,4];
var b:Set=[3,4,5,6];
var c:Set=a.subtract(b);
for i in c{
print(i);
}
输出12
[集合关系]
SWIFT里可以直接判断集合之间的关系,相等,包含,不包含,交叉
使用==来判断两个集合是否相等
var a:Set=[1,2,3,4];
var b:Set=[1,2,3,4];
if(a==b){
print("这两货相等");
}else{
print("这两货不像等");
}
输出 "这两货相等"
使用isSubsetOf()方法来判断一个集合是否被包含于另一个集合
var a:Set=[1,2,3,4];
var b:Set=[1,2,3,4,5];
if(a.isSubsetOf(b)){
print("a被b包含");
}else{
print("a并不被b包含");
}
输出"a被b包含"
使用isSupersetOf()方法来判断一个集合是否包含另一个集合
var a:Set=[1,2,3,4];
var b:Set=[1,2,3,4,5];
if(a.isSupersetOf(b)){
print("a包含b");
}else{
print("a并不包含b");
}
输出"a并不包含b"
这里我们可以看出isSubsetOf()和isSupersetOf()是一个意思,但方向相反.
使用isStrictSubsetOf()方法来判断一个集合是否是另一个集合的子集,且不相等
var a:Set=[1,2,3,4];
var b:Set=[1,2,3,4,5];
if(a.isStrictSubsetOf(b)){
print("a是b的子集,且与b不等");
}else{
print("a不是b的子集");
}
输出"a是b的子集,且与b不等"
使用isStrictSupersetOf()方法来判断一个集合是否是另一个集合的父集,且不相等
var a:Set=[1,2,3,4];
var b:Set=[1,2,3,4,5];
if(a.isStrictSupersetOf(b)){
print("a是b的父集,且与b不等");
}else{
print("a不是b的父集");
}
输出"a不是b的父集"
这里我们可以看出isStrictSubsetOf()与isStrictSupersetOf()方法也是同一个意思,但方向不同.
使用isDisjointWith()方法来判断两个集合是不是没有交集
var a:Set=[6,7,8,9,0];
var b:Set=[1,2,3,4,5];
if(a.isDisjointWith(b)){
print("a与b没有交集");
}else{
print("a与b有交集");
}
输出"a与b没有交集"
[字典]
字典就是我们经常用的那本新华字典,哦不,不是,恩...其实也是一个意思,在php语法中,字典其实就是关联数组的意思,如果你会一些nosql技术,就更好理解了,就是键值对的意思.一个key对应一个value值.就像字典一样,找到拼音然后找到字.
(字典)
[创建一个空字典]
创建一个字典我们需要指定2个数据类型,一个是key的数据类型,一个是value的数据类型
var a=[Int:String]();
var b=[String:String]();
这个具体的要看你怎么用了
[创建一个有初始值的字典]
创建一个有初始值的字典和数组一样,可以直接指定数据类型,也可以让SWIFT自己去猜.
var a:[Int:String]=[010:"北京",021:"上海"];
var b=[0551:"合肥",0554:"淮南"];
var c:[String:String]=["北京":"雾霾","上海":"晴","菲律宾":"龙卷风"];
var d=["冲绳":"暴雨","大板":"海啸","东京":"红灯区"];
[字典长度]
和其他的一样,字典的长度也是通过他的count属性来获取的
var a:[Int:String]=[010:"北京",021:"上海"];
print(a.count);
输出2
[字典为空]
还是那个方法,isEmpty
var a:[Int:String]=[010:"北京",021:"上海"];
if(a.isEmpty){
print("字典是空的");
}else{
print("字典不是空的");
}
输出 "字典不是空的"
[读取字典]
我们可以直接使用字典的key来读取对应的value值
var a=["name":"张三","age":"16","address":"屎壳郎村"];
print("大家好,我叫\(a["name"]),今年\(a["age"])岁,现在住在\(a["address"])");
输出 "大家好,我叫Optional("张三"),今年Optional("16")岁,现在住在Optional("屎壳郎村")"
TIP: 这里大家可能不知道为什么会出现Optional字符,这是因为我们在创建的时候没有指明数据类型,是SWIFT自己猜的,所以他会说Optional(可选的)类型
[添加]
给字典添加新元素比较容易,使用 变量["key"]=value 直接添加即可
var a=["name":"张三","age":"16","address":"屎壳郎村"];
a["pc"]="mac";
print(a["pc"]);
输出 "Optional("mac")"
[修改]
修改字典的数据也是比较容易的,和添加方法一样
var a=["name":"张三","age":"16","address":"屎壳郎村"];
a["name"]="李四";
print(a["name"]);
输出 "Optional("李四")"
TIP:这里要注意一下,字典的添加和修改用的都是同样的方法,所以,在执行你要做的操作前最好判断一下.
我们还可以通过updateValue()方法来修改值,不过和上面的方法一样,同样是有值修改,无值添加.
var a=["name":"张三","age":"16","address":"屎壳郎村"];
a.updateValue("李四", forKey: "name");
a.updateValue("mac", forKey: "pc");
print(a["name"]); //输出:Optional("李四")
print(a["pc"]); //输出:Optional("mac")
[删除]
要想删除一个字典里的值,直接赋值空即可
var a=["name":"张三","age":"16","address":"屎壳郎村"];
a["name"]=nil; //看不懂?留意本文最后的小贴士.
print(a["name"]); //输出 nil
我们还可以使用removeValueForKey()方法来删除指定的项
var a=["name":"张三","age":"16","address":"屎壳郎村"];
a.removeValueForKey("name");
print(a["name"]); //输出 nil
[遍历]
和大家一样,都是使用for...in来实现,不过不同的是,字典要同时传入2个变量才能遍历
var a=["name":"张三","age":"16","address":"屎壳郎村"];
for (i,j) in a{
print(i+"--"+j);
}
输出:age--16 address--屎壳郎村 name--张三
当然,我们也可以只遍历key或只遍历value
var a=["name":"张三","age":"16","address":"屎壳郎村"];
for i in a.keys{
print(i);
}
输出:age address name
var a=["name":"张三","age":"16","address":"屎壳郎村"];
for i in a.values{
print(i);
}
输出:16 屎壳郎村 张三
我们在遍历无序列表的时候,可以使用sort()方法来帮助我们简单的排序一下
var a=["name":"张三","age":"16","address":"屎壳郎村"];
for i in a.keys.sort(){
print(i);
}
输出:address age name
小贴士:SWIFT里的空不是用大家熟悉的none,或null来表示,而是使用nil来表示空.
好了,今天就学到这里,我们下节课再见!Bye!