Swift-字典
2016-05-05 12:14
274 查看
原本我以为 Swift 中的字典和其它语言中的字典应该差不多,所以不打算单独写一篇关于字典的博客。可学习了之后我才发现 Swift 中的字典竟然有很多与众不同的地方。吓得我赶紧记录一下。。。
和其它语言中一样的地方就没啥好说的了,我们直接来说它与众不同的地方。
我们先拿数组来做比较。首先,在数组中肯定不能访问不存在的下标,否则会出现越界的错误,这点大家都知道。
但是,字典却可以!
然后来说 nil,还记得上篇文章我们怎么讲 nil 的吗?
只有最下面这种写法才是正确的。但是字典又可以!
增加新项还有其它方式,比如:
删除项也有其它方式,比如:
然后我们来说说字典的遍历。
遍历所有的键:
这种比较好理解。还可以直接利用 keys 构造一个新数组:
上面这些都比较好理解,但还有其它方式:
类似的,获取 value 也有这些方法:
那如果想同时获取 key 和 value 呢?
嗯,这个也比较好理解,那你猜猜下面的代码输出是什么?
然而,事实却是:
咦?这是为什么呢?哈哈,其实是被误导了。这里的 key 跟字典中的键完全没有关系,这里的 key 只不过是个参数名而已,叫什么都可以。如果写成下面这样是不是就懂了:
其实是我看别人的代码的时候被误导了,所以在此记录一下。规范的命名很重要啊。。。
和其它语言中一样的地方就没啥好说的了,我们直接来说它与众不同的地方。
我们先拿数组来做比较。首先,在数组中肯定不能访问不存在的下标,否则会出现越界的错误,这点大家都知道。
但是,字典却可以!
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") */
其实是我看别人的代码的时候被误导了,所以在此记录一下。规范的命名很重要啊。。。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- Apple Swift学习教程
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- 你应该学习哪种编程语言?
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- [转]我们需要一种其他人能使用的编程语言
- 介绍 Fedora 上的 Swift
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- C#语言主要特性总结
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C语言中static的作用及C语言中使用静态函数有何好处