Swift-字典

原本我以为 Swift 中的字典和其它语言中的字典应该差不多,所以不打算单独写一篇关于字典的博客。可学习了之后我才发现 Swift 中的字典竟然有很多与众不同的地方。吓得我赶紧记录一下。。。


和其它语言中一样的地方就没啥好说的了,我们直接来说它与众不同的地方。

我们先拿数组来做比较。首先,在数组中肯定不能访问不存在的下标,否则会出现越界的错误,这点大家都知道。


但是,字典却可以!

var dict = ["key1":"value1" , "key2":"value2"]
dict["key3"] = "value3"
print(dict) // 输出结果为 ["key1": "value1", "key3": "value3", "key2": "value2"] (别忘了字典是无序的)
我们访问了一个不存在的 key3,最终结果是创建了新的一项。


然后来说 nil,还记得上篇文章我们怎么讲 nil 的吗?


只有最下面这种写法才是正确的。但是字典又可以!

var dict = ["key1":"value1", "key2":"value2", "key3":"value3"]
dict["key2"] = nil
print(dict) // 输出结果为 ["key1": "value1", "key3": "value3"]
我们直接把键为 key2 的值赋成 nil,最终结果是从字典中移除了这一项。

增加新项还有其它方式,比如:

dict.updateValue("123", forKey: "key4")
如果有 key4 这一项,会更新该项。如果没有这项的话就会新增这一项。


删除项也有其它方式,比如:

dict.removeValueForKey("key1") // 这里即使写不存在的也不会出错,比如"key8"、"key9"


然后我们来说说字典的遍历。

遍历所有的键:

for keys in dict.keys {
    print(keys)
}
/*
 key1
 key3
 key2
 */

这种比较好理解。还可以直接利用 keys 构造一个新数组:

let keysArray = Array(dict.keys)
print(keysArray)
/*
 ["key1", "key3", "key2"]
 */

上面这些都比较好理解,但还有其它方式:

for (key, _) in dict {
    print(key)
}
/*
 key1
 key3
 key2
 */
注意 '_' 的用法,此处代表我们只关心 key,不关心 value。


类似的,获取 value 也有这些方法:

for values in dict.values {
    print(values)
}
/*
 value1
 value3
 value2
 */

let valuesArray = Array(dict.values)
print(valuesArray)
/*
 ["value1", "value3", "value2"]
 */

for (_, value) in dict {
    print(value)
}
/*
 value1
 value3
 value2
 */

那如果想同时获取 key 和 value 呢?

for (key, value) in dict {
    print(key, value)
}
/*
 key1 value1
 key3 value3
 key2 value2
 */

嗯,这个也比较好理解,那你猜猜下面的代码输出是什么?

for key in dict {
    print(key)
}
估计会有很多人和我一样,认为是输出三个 key 吧?

然而,事实却是:

/*
 ("key1", "value1")
 ("key3", "value3")
 ("key2", "value2")
 */


咦?这是为什么呢?哈哈,其实是被误导了。这里的 key 跟字典中的键完全没有关系,这里的 key 只不过是个参数名而已,叫什么都可以。如果写成下面这样是不是就懂了:

for aDictionary in dict {
    print(aDictionary)
}
/*
 ("key1", "value1")
 ("key3", "value3")
 ("key2", "value2")
 */

其实是我看别人的代码的时候被误导了,所以在此记录一下。规范的命名很重要啊。。。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值