天天看点

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

集合类分为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 = Array(repeating:, count:) //包含3个double变量,值都为1.3
var array5 = [Double](repeating:, count:) //包含3个double变量,值都为1.3
           

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

var value = array1[]
           

清空数组

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

想要清空某个元素,用remove(at:) 方法

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

array1.removeSubrange(..<arr.endIndex)// 这里会移除从开始,但是不包括end的元素,但是endIndex是指向最后一个元素的后一个元素的,所以会从index为的元素开始,删除后面全部。
array4[...] = [] //这里将范围-的元素都清空了,注意一点,如果数组越界的话,会产生运行时错误
           

向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", at:)   //array5包含 first A d e last, 5个元素
           

改变array元素

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

遍历数组

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

Set

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

var emptySet = Set<Character>() //建立一个空set,必须指明内容的类型
var nameSet : Set<String> = ["Tom","Lucy","Aaron"]  //使用初始数据建立set
           

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

移除Set

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

移除一个元素有两种办法

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

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

遍历Set

for name in nameSet.sorted() { //这里的sorted()可以不用,这里用来排序
    print(name)
}
           

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

Set操作

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

let oddDigits: Set = [, , , , ]
let evenDigits: Set = [, , , , ]
let singleDigitPrimeNumbers: Set = [, , , ]

oddDigits.union(evenDigits).sort()
// [, , , , , , , , , ]
oddDigits.intersection(evenDigits).sort()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sort()
// [, ]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sort()
// [, , ]
           

Set关系

isSubset(of:) 判断一个set是否为另外一个set的子set

isSuperset(of:) 判断一个set是否为另外一个set的父set

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

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

Dictionary

创建Dictionary的三种方法

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

添加/修改/删除dictionary

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

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

现在新增了一个更改和删除的方法,可以获得更新和删除前的旧值(可选类型)。如果这个值以前不存在,那么返回nil

let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") 
let removedValue = airports.removeValue(forKey: "DUB") 
           

遍历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]!)
}