Swift学习笔记4——集合类型

时间:2022-04-14 17:02:04

请移步到Swift4 点击打开链接


集合类分为array、dictionary、set。每个集合都有一个isEmpty属性来判断这个集合是否为空


Array

创建array的四种方法

var array1 = ["a","b","c"] //包含 a b c 三个字符串
var array2 = Array<Int>() //空array,这里一定要指明元素类型
var array3 = [String]() //空array
var array4 = [Double](count: 3, repeatedValue: 1.3) //包含3个double变量,值都为1.3

获取array的某个元素,直接用下标就行

var value = array1[2]

清空数组

//将array1变为空,下面两个方法是等价的
array1.removeAll()
array1 = [];

想要清空某个元素,用removeAtIndex(Int) 方法

如果想要清空某个范围的元素,API提供了

array1.removeRange(Range(start: 1, end: 2))  // 这里会移除从start开始,但是不包括end的元素

array4[1...2] = [] //这里将范围1-2的元素都清空了,注意一点,如果数组越界的话,会产生运行时错误


向array添加元素

//使用append()方法
array1.append("A") //向array1的末尾添加一个 A,现在只有一个 A 元素
//使用运算符号
array3 += ["d","e"] //array3从空数组变为包含 d e 两个字符串
var array5 = array1 + array3 + ["last"] //array5包含 A d e last, 4个元素
//使用insert方法
array5.insert("first", atIndex: 0) //array5包含 first A d e last, 5个元素

改变array元素

array5[0] = "newBe"
array5[1...3] = ["1","2","3"]

遍历数组

for item in array5 {
print(item)
}
for (index,item) in array5.enumerate() {
print(index,item)
}


Set

set里面的元素都必须实现hashable。因为区分set里面的元素的根本就是判断两个元素的hash值是否相等。swift基本类型都实现了hashable

var emptySet = Set<Character>() //建立一个空set
var nameSet : Set<String> = ["Tom","Lucy","Aaron"] //使用初始数据建立set

这里发现一个有意思的地方,就是利用swift的类型识别机制,在初始化set的时候不加类型,下面的语句是没问题的

var nameSet : Set = ["Tom","Lucy","Aaron",3]  //使用初始数据建立set
那么这个set的元素类型是什么呢?我尝试探究了一下,先自己建立了一个类Animal,然后尝试将这个类的对象添加到上面的nameSet里面去

var animal : Animal = Animal()
nameSet.insert(animal) //这句编译时报错了
这时候编译是不能通过的,第二句报错说不能将Animal转换为NSObject,也就是说nameSet里面的类型都是NSObject。虽然Swift里面提供了AnyObject代表任何类型,但是你会发现这个AnyObject是没有实现hashable的,也就不能作为Set的元素。

然后我用下面的代码判断了一下,其实String,数字类型,布尔类型都是NSObject。但是Character和Tuple并不是NSObject

var i:Character = "1";
var tuple = ("e",1)
var b = true
var str :String = "fe"
if b is NSObject {
print("yes")
}


至于为什么我自己创建的Animal类不是NSObject,我会在后面的Swift类里面讲到。现在让我们回到Set。

Set的添加只有刚刚上面那个 insert 方法,就不介绍了。


移除Set

removeAll(),这个方法还可以传一个boolean参数,表示是否保持空间,传ture的话表示保持。

移除一个元素有两种办法

var index = nameSet.indexOf("Tom")
nameSet.removeAtIndex(index!) //因为indexOf返回的是可选类型,所以这里要解包

nameSet.remove("Tom") //这种和上面的是等价的。

遍历Set

for name in nameSet.sort() {
print(name)
}

Set和Array都有一个contains方法来判断是否包含某个元素。


Set操作

包括了求交集,并集,“减集”,“异或集”,直接上官方代码

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

oddDigits.union(evenDigits).sort()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersect(evenDigits).sort()
// []
oddDigits.subtract(singleDigitPrimeNumbers).sort()
// [1, 9]
oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort()
// [1, 2, 9]


Set关系

isSubsetOf(_:) 判断一个set是否为另外一个set的子set

isSupersetOf(_:)  判断一个set是否为另外一个set的父set

isStrictSubsetOf(_:) or isStrictSupersetOf(_:)   意思和上面的一样,只是这两个方法不能存在相等的情况。

isDisjointWith(_:)  判断两个set是否没有共同元素,没有的话返回true


Dictionary

创建Dictionary的三种方法

var dict1 : [String:Int] = ["a":1,"b":2,"c":3]
var dict = ["a":1,"b":2,"c":3, 3:"d"] //注意这个没声明类型的,因为key和value里面都有不同的类型,所以swift将二者都转为了NSObject,但是如果key(value)类型只有一种的话,那么就会转为那种类型。
var dict2 = [Int:String]()
var dict3 = Dictionary<String,Int>()


添加/修改/删除dictionary

dictionary也提供了removeAll,removeAtIndex之类的方法。使用和Set是一样的,就不写了。下面是dictionary特有的

dict[5] = "f" //添加一个键值对  5: "f"
dict[5] = 5 //修改key为5的值为5
dict[5] = nil //删除key为5的键值对
dict[6] = nil //对不存在的键值对赋nil不会报错
dict2 = [:] //清空所有

遍历dictionary

同样可以对key和value进行遍历,只需把in 后面改为 dict.keys 或 dict.values 就行了。

for (key,name) in dict {
print(key,name,separator:":")
}

var keys = dict1.keys.sort();
for key in keys {
print(key,dict[key]!)
}