数组
一个数组的元素的类型是一样的,不能有多种数据类型
使用var声明的是可变数组,let声明的是不可变数组
声明和创建
var arr1 : Array<String>
var arr2 : [Int]
var arr3 : [String]
arr1 = Array<String>()
arr2 = Array<Int>(count: 10, repeatedValue: 0)
arr2 = [0,1,2]
赋值和元素数
arr2[0] = 1
print(arr1.count)
添加和删除元素
arr1.append("spring")
arr1 = arr1 + ["summer"]
arr3 = ["win"]
arr1 += arr3
arr1.insert("fall", atIndex: 2)
let weather = arr1[0...1]
arr1[1...3] = ["2","3","4","5"]
arr1.removeAtIndex(4)
arr1.removeLast()
arr1.removeAll()
字典
一个字典中的key或value只能有一种类型,比如key是String类型,value是Int类型,不能value中包含多种类型
使用var声明的字典是不可变的,使用let声明的字典是可变的
//声明和实现
var myDic : Dictionary<String, String>
var scores :[String:Int]
var health : [String:String]
myDic = Dictionary<String, String>()
scores = Dictionary<String, Int>(minimumCapacity: 5)//创建包括5个key-value对的字典,感觉没啥用
print(scores.isEmpty)
health = ["height":"178", "weight":"80"]
var emptyDict:[String:Double] = [:]
//获取value值和赋值
print(health["height"]) //Optional("178")
print(health["height"]!) //178
//使用key来访问value的时候,返回的并非是字典中存储的value类型,而是value的可选类型,当key不存在的时候,返回的是nil
//需要使用返回的值的时候,需要加叹号来强制解析
print(health["noExit"]) //nil
health["blood"] = "78/112"
//updataValue可以返回之前存储的value,如果之前key不存在,则创建键值对
var result = scores.updateValue(20, forKey: "java")
print(result)//nil
print(scores)//["java": 20]
var java = scores.updateValue(30, forKey: "java")//
print(java)//20
print(scores)//["java": 30]
//for in遍历字典
for (name, num) in health
{
print("(name)(num)")
}
print(health.keys)//LazyMapCollection<Dictionary<String, String>, String>(_base: ["height": "178", "weight": "80", "blood": "78/112"], _transform: (Function))
var keys = Array(health.keys)
print(keys)//["height", "weight", "blood"]
//删除键值对
health.removeValueForKey("height")
print(health)
health["blood"] = nil
print(health)//可以通知赋值为nil来删除键值对
health.removeAll()//删除所有键值对
集合的复制
Swift的集合都是结构体类型,这些结构体类型都是值类型的。
在值类型赋值或参数传递的过程中会复制副本,所赋的值或传递的参数,其实只是原数据的副本
Swift语言中与值类型对应的是引用类型,Swift的类才是引用类型,引用类型在赋值或传递参数过程中只是传递引用(也就是指针,不会复制对象的副本)
虽然集合与整形,浮点型,字符串等都是值类型,但是由于集合本身是一个容器,它会包含另外一些数据,因此集合的复制要稍微复杂一点
当集合包含的数据是值类型的时候,那么复制集合时,集合所包含的数据也会复制副本;如果集合包含的数据是引用类型,那么复制集合时,程序只是复制集合所包含的引用——这些引用实际所指向的对象并不会复制