[关闭]
@phper 2016-08-23T15:06:43.000000Z 字数 4237 阅读 875

swift 6. 字典

swift


这一节,继续上一讲的数组,继续学习集合里面的字典。字典故名思议,有索引,有值,所以才叫字典,也就是一个键值对的合集,它是无须的。所以,如何理解swift的字典呢,就是php中的索引数组。这样就好理解多了。

字典长啥样

在学习如何申明一个字典之前呢,我们看下字典长啥样?

  1. ["TYO": "Tokyo", "DUB": "Dublin"]
  2. ["TYO": 45, "DUB": 66]

看,字典就长这样,就是一个一个key:value的组成的数组,也就是一个键值对的组合。

申明一个字典

在知道字典长这样了之后,我们或许已经知道如何创建一个字典呢。先从最原始的来申明创建:

  1. var userinfo: Dictionary<String, String> = ["name": "yangyi", "gender": "male"]

这种申明比如原始:先定义它是什么类型的字典,我们用var来申明是一个变量型字典,后面是可以修改的。然后,紧接着就是这个字典的名字userinfo,后面加一冒号: 再加上字典的申明标识符Dictionary,这个是写死的就得这样写,它表示是一个字典类型的数据,然后就是<type, type>键值对分别 是什么类型的,我们这里申明为键值对都是字符串型String。后面就是它的值了。是2个键值对的数组。

上面是申明字典并且附上值,那么如何创建空的字典呢。有下面4种方法:

  1. // 创建空字典
  2. var emptyDictionary1:[String:Int] = [:]
  3. var emptyDictionary2:Dictionary<Int,String> = [:]
  4. var emptyDictionary3 = [String:String]()
  5. var emptyDictionary4 = Dictionary<Int,Int>()

记住,最后的括号()不能丢!

我们顺便来回顾一下,前面的几节当中,如何原始的申明一个变量,并且附上空值的:

  1. //整型
  2. var init1:Int = 3
  3. //字符型
  4. var string2:String = "iphone"
  5. //布尔值
  6. var bool1:Bool = false
  7. //浮点型
  8. var float1:Float = 1.234
  9. //元祖
  10. var tuples1:(Int, String, Int) = (1, "wer", 12)
  11. //访问tuples1.0, tuples1.1, tuples1.2
  12. var tuples2 = (se:12, we:33)
  13. //访问tuples2.se , tuples2.we
  14. //数组
  15. var array1:[String] = ["iphone", "mac", "ipad"]
  16. var array2:[Int] = [1, 2, 3]
  17. //申明空值数组
  18. var array3 = [String]()
  19. //申明有默认值的数组
  20. var array4 = [String](count: 2, repeatedValue: "we")
  21. var array5 = Array(count: 2, repeatedValue: "we")

访问和修改字典

上面讲了申明了一个字典,那怎么访问呢?其实,和访问数组的方式基本一样,只不过要用keyD1[key]

  1. var userinfo2 = ["name":"yangyi", "gender":"male"]
  2. print(userinfo2["name"]) //输出的是可选类型的:Optional("yangyi")
  3. //我们如何确认name存在,则可以用!来强制解包
  4. print(userinfo2["name"]!) //输出:yangyi
  5. //所以结合前面的可选型的用法,来解包:
  6. if let name = userinfo2["name"]{
  7. print("nams is" + name) //输出:name is yangyi
  8. }
  9. var userinfo3 = [0:"yangyi", 1:"male"]
  10. print(userinfo3[1]) //输出:male
  11. print(userinfo2.name) //报错了,你看搞混了吧。元祖才可以这样写!!

所以,同样,我们也是用 d1["name"] = "value" 这种方式来给字典赋值:

  1. var d2 = Dictionary<Int, String>() //空的
  2. d2[1] = "qw"
  3. d2[4] = "rt"
  4. print(d2) //输出: [4: rt, 1: qw]
  5. var d3 = ["name":"yangyi", "gender":"male"]
  6. d3["name"] = "liming" // 讲name改成了liming
  7. d3["height"] = "190" // 新加一个key height,值为190
  8. //d3["name"] = 33 // 报报错,不能将一个string转换成int型
  9. print(d3) // [name: liming, gender: male, height: 190]

swift中呢,还有一个专门来跟新字典的方法函数叫updateValue("value", forKey:key), 它是有返回值的,如果有这个key, 修改成功后,返回的是原来的老值。如果没这个key,则返回空,swift中空为:nil,但是这个key 被加进去字典里了。

  1. var d3 = ["name":"yangyi", "gender":"male"]
  2. var oldname = d3.updateValue("wangming", forKey: "name")
  3. //讲name这个key替换成wangming
  4. print(oldname) //原来的值为:Optional("liming")
  5. print(d3) // [name: wangming, gender: male, height: 190]

下面是nil的情况:

  1. var d3 = ["name":"yangyi", "gender":"male"]
  2. var oldage = d3.updateValue("12", forKey: "age")
  3. //讲age这个key替换成12。但是,却是不存在这个age这key的,所以值是nil
  4. print(oldage) //nil
  5. print(d3) // age加进去了 ["gender": "male", "age": "12", "name": "yangyi"]

字典删除或置空

我们赋值一个字典后,如果想要把这个字典重新赋值为空,可以直接这样:d1 = [:]; 这样就把d1字典给置空了:

  1. var d1 = ["name":"yangyi", "gender":"mail"]
  2. println(d1) // [name: yangyi, gender: mail]
  3. d1 = [:] //置空
  4. print(d1) // []

有时候,我们并不想把所有的字典里面的元素给置空或删除,只是想把其中的某一个key给干掉,用d1["name"] = nil 这样就可以了

  1. var d1 = ["name":"yangyi", "gender":"mail"]
  2. d1["name"] = nil //把key name给干掉了
  3. print(d1) // 输出为:[gender: mail]

有这种常见的方式移除,那么肯定有一个函数方法来移除某一个key了,swift一般是按照常理出牌的,它就是removeValueForKey(key) 同样,存在这个key则返回它的值,不存在则是返回nil

  1. var oldgender = d1.removeValueForKey("gender")
  2. print(oldgender) //可选值:Optional("mail")
  3. print(d1) / 被移除了:[name: yangyi]

removeAll函数,顾名思义,就是移除所有的内容。

  1. var d1 = ["name":"yangyi", "gender":"mail"]
  2. d1.removeAll()

字典常用的方法和函数

count 求字典的数据数量:

  1. var dict = ["name":"xiaoming"]
  2. // 字典数据数量
  3. dict.count // 1

isEmpty 判断字典是否为空,是返回true,不为空则返回false

  1. // 判断字典是否为空
  2. var dict = ["name":"xiaoming"]
  3. dict.isEmpty // false
  4. var emptyDictionary1:[String:Int] = [:]
  5. emptyDictionary1.isEmpty //true

字典的遍历

我们来是这样手动的方式来访问字典的确不太好,既然是一个数据,那么是肯定是可以用for来遍历的,可以使用for-in循环来遍历某个字典中的键值对。每一个字典中的数据项都由(key, value)元组形式返回:

  1. var d9 = ["name":"yangyi", "gender":"mail"]
  2. //用元祖的形式来遍历字典
  3. for (key, value) in d9 {
  4. print("键为\(key), 值为\(value)")
  5. }
  6. //键为name, 值为yangyi
  7. //键为gender, 值为mail

我们也可以通过访问字典的keys或者values属性(都是可遍历集合)检索一个字典的键或者值。

  1. var d9 = ["name":"yangyi", "gender":"mail"]
  2. for key in d9.keys {
  3. print("键为\(key)")
  4. }
  5. //键为name
  6. //键为gender
  7. for value in d9.values {
  8. print("值为\(value)")
  9. }
  10. //值为yangyi
  11. //值为mail
  12. print(d9.values)
  13. // LazyMapCollection<Dictionary<String, String>, String>

上面我们打印了d9.values 得到的是一个字典集合,我们可以直接把它变成数组,因为理论上它就是一个数组的形式: Array(d9.values)

  1. var d9 = ["name":"yangyi", "gender":"mail"]
  2. var keyinfo = Array(d9.keys)
  3. var valueinfo = Array(d9.values)
  4. print(keyinfo) // [name, gender]
  5. print(valueinfo) // [yangyi, mail]

字典的比较

由于字典是无须的,而且,swift中对于2个类型的值的比较,是比较值的,而不是引用。所以2个字典,只要值一样,顺序不同,也是一样:

  1. let dict1 = [1:"A", 2:"B", 3:"C"]
  2. let dict2 = [1:"A", 3:"C", 2:"B"]
  3. dict1 == dict2 //true

OK, 字典基本的内容就讲完了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注