三.字典:字典中以key-value的形式保存数据,所以同一个字典中key不能重复。
1. 声明字典--两种方式
(1)适宜用泛型。
var myMap : Dictionary<String, String>
(2)使用简化语法。
var scross : [String:Int] **** 中间是冒号,不是逗号
var helath : [String : String]
2. 创建字典--两种方式
(1)使用Dictionary的构造器创建字典---init
init(minimumCapaity: = 2):创建一个至少包含minimumCapacity个key-value。
**** minimumCapacity的默认值是2。
举个栗子:
myDict = Dictionary<Stirng, String>() --使用默认的构造器
score = Dictionary<String, Int>(minimumCapacity : 5)
(2)使用简化语法
health = ["身高":"180", "体重":"80", "血压":"86/113", "呼吸":"56"]
vardict = ["one":1, "two",2 "three":3, "four":4]
*****可以看出,使用简化语法时,跟元组不同的地方是括号的区别。
四.使用字典
1. 根据key访问对应的value: var value = health["呼吸"]---比Java中的getxxx方法方便很多。
2. 访问不存在的key时会返回nil。
---- 推断出:当程序根据key访问字典中对应的value时,字典返回的并不是对应的value的类型,而是包含value的可选类型——这是因为字典并不确定访问的value是否存在,当key-value存在时返回对应的value,当key-value不存在时返回nil ---- 这一点比Java中健壮很多。
3. 由于字典根据key访问时返回的是包含value的可选类型,因此程序需要对字典返回的value使用感叹号进行强制解析。---举个栗子:
var noExist : Int? = health["no"]
if noExist != nil
{
print(noExist!) ---注意使用了感叹号进行强制解析
}else
{
print("this is a nil")
}
4. 修改字典中元素:直接使用key就可以对元素进行修改,如果相应的key-value不存在,则会添加该key-value。
举个栗子:
health["身高'] = “190” //直接修改
health["睡眠"] = “良好” //进行添加
5. Swift还提供了updateValue()方法来修改字典中的元素,该方法的作用与直接修改相比,强大的一点是可以返回修改之前的value ----当然,返回的也是包含value的可选类型
举个栗子:
var result1 = dict.updateValue(10, forKey: "ten") //返回nil
var result2 = dict.updateValue(40, forKey: "four") //返回4
6. 使用for-in遍历字典:for-in循环同样也可以用于遍历字典,每次都以元组都形式返回。
for (str, num) in dict
{
print("\(str)-->\(num)")
}
7. 单独使用字典的keys或者values:如果程序中只需要字典的key集或value集,就直接使用字典的keys属性或者values属性,即可返回字典中所有的key或value,然后将它们包装成数组即可。
var keys = ArrAy(dict.keys)
var values = Array(dict.values)
8. 字典的可变性:使用var声明的是可变的,使用let声明的是不可变的。
9. 字典的修改:
(1)添加、修改:见4、5
(2)删除:removeValueForKey(key:KeyType):删除指定key对应的value,该方法返回包含value的可选类型。
removeAll(keepCapacity: bool = false):清空字典。其中keepCapacity参数指定是否保留字典底层的数据缓冲。不传入参数keepCapacity时默认为false;
(3)除此之外,Swift还允许将某个key对应的value赋值为nil来删除key-value对。----与removeValueForKey相比,这样比较方便,但是不能返回value,而removeValueForKey可以返回value。
五.集合的复制
1. Swift的集合都是结构体类型,这些结构体类型都是值类型的。
2. 在值类型赋值或参数传递的时候会复制副本,所赋的值或传递的参数都是原数据的副本。
3. 当集合进行复制时,集合所包含的数据是否也会进行复制取决于聚合所包含的数据类型:如果集合所包含的数据是值类型的,那么复制集合时,集合所包含的数据也会进行复制;如果集合包含的数据是引用类型的,那么集合复制时,程序只是复制集合所包含的引用—这些引用实际指向的对象并不会复制。
4. 数组的复制:
例子1:var name = ["唐僧", "孙悟空", "猪八戒", "沙僧"]
var cp1 = name;
var cp2 = name;
name,cp1,cp2各自修改了内容之后会显示各自的结果,互不影响。
例子2:
class Person
{
var name : String
init(name : String)
{
self.name = name;
}
}
var persons = [Person(name:"唐僧"), Person(name:"孙悟空"), Person(name:"猪八戒"),
Person(name:"沙僧")]
var cp1 = persons;
var cp2 = persons;
不同于例子1,因为这里数组中的内容是引用(指针)类型,所以尽管复制了内容的副本,但是还是指向相同的对象,其中一个修改时,其他的数组中对应的值也会随着改变。
4. 字典的复制:原理同数组的复制。
下一篇: 每天学一点Swift----函数(一)