您的位置:首页 >> APPLE >> 和屌丝一起学SWIFT-集合类型
和屌丝一起学SWIFT-集合类型
[ 孤狼 | 2015-12-04 10:48:54 | APPLE ]

声  明

       本教程仅用于初学SWIFT同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用SWIFT版本为2.0。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。PAEA.CN版权所有。

        

        大家好,欢迎回到和屌丝一起学SWIFT系列教程中来,上节我们说到了字符串和字符,大家有没有好好练习啊,是不是很简单啊.那么这节我们就来说一说另一个比较常用的东西-集合.

 

        在SWIFT中,一共有3种集合表现形式,数组(Array)集合(Sets)字典(Dictionaries).其中数组是有序集,而集合和字典都是无序的,具体的我们代码中体现.

 


[数组]

        数组是我们大家最常见的,因为他再任何语言中都存在,只是有些语言中的使用方法不一致.    在SWIFT中,同纬数组只能存放指定的类型数据.

 

1.jpg

(数组)


[创建一个空数组]

创建一个空数组只要定义好一个变量,然后指定一个类型即可.

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)用来存储相同类型并且没有确定顺序的值,集合与数组一样只能保存同一种类型的数据

 2.jpg

(集合)


[创建一个空集合]

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"

 

[求交集]

21.jpg

集合可以使用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

 

[求差集]

22.jpg

集合可以使用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

 

[合并集合]

23.jpg

可以使用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

 

[排除集合]

24.jpg

可以使用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值.就像字典一样,找到拼音然后找到字.

3.jpg

(字典)

 

[创建一个空字典]

创建一个字典我们需要指定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!

 

 

本节代码下载


转载请注明出处:http://gl.paea.cn/apple/content/2015/12/04/83.html