一.引子:

在2014年10月TIOBE编程语言排行榜中,Swift位居第18位,从2014WWDC发布会首次公布至今不到半年时间,swift一直受到编程人 员的追捧,其热衷程度并不亚于当红巨星Taylor Swift。相信在不远的将来,swift能够平稳发展,并逐步取代Objective-C。

二.swift的集合类型

下面回归主题。作为一名iOS开发者,我们已经非常熟悉诸如NSArray,NSDictionary,NSSet等常见集合类型,以及它们的可变同类
NSMutableArray,NSMutableDictionary,NSMutableSet。而swift则为我们提供了原生的Array和
Dictionary集合类型,遗憾的是,目前还没有提供Set这样的集合类型(预计将来可能会添加进去)。与Objective-C不同的
是,swift不存在对应的mutable类型,原因是一个集合类型是否可变是通过修饰符var和let决定的,因此,如果一个集合类型的变量是let修
饰的,则这个集合类型是不可变的。如果一个集合类型的变量是var修饰的,则这个集合类型是可变的。例如:

  1. var mutableArray = Array<Int>()
  2. mutableArray.append(1)
  3. let immutableArray = Array<String>()
  4. immutableArray.append("item")    // 编译时错误

如果不知道修饰符let和var的区别,可以这样简单理解,let修饰的变量是常量,一旦赋值后就不能再改变。而var修饰的变量的值可以动态改变。

三.范型集合

Objective-C的集合类型对集合里的元素只有一个要求,那就是它必须是一个OC对象(很多时候我们想要往里面添加基本数据类型时,都要用
NSNumber封装一下才能放到集合里去)。而swift则不同,swift宣称自己是类型安全的,因为swift的特性里包含现代语言里都会有的范型
(generic)。因此我们在调用集合类型的初始化方法时,都要注明这个集合类型的元素数据类型。比如:

  1. var intArray = Array<Int>()
  2. intArray.append(2014)
  3. intArray.append("2014")    // 编译时错误
  4. var creditDictionary = Dictionary<String,Int>()
  5. creditDictionary.updateValue(88888, forKey: "Benson")

在上面的例子中,声明了一个整形数组和一个KeyType为String,ValueType为Int的字典。整形数组里只能存放整形元素,如果放
入字符串元素,编译器就会报错(值得注意的是,如果放入浮点类型或者布尔类型,编译器会自动将其转换为整形,比如3.14转换成3,true转换为1)。
有了范型,就可以确保类型安全,而不用再进行类型判断和强制类型转换等麻烦操作。

(数组的元素类型没有任何限制,但是字典对KeyType设定了类型限制(Type
Constraints),它规定KeyType必须实现Hashable协议,该协议规定遵循类必须提供gettable的hashValue属性。值
得庆幸的是,String,Int,Double,Bool等常用类型都实现了该协议,一般情况下够用了。)

四.简写形式

对于集合类型的初始化,大多数情况下都不采用上面例子中的写法,而是采用更加简洁的形式。

  1. var shorthandArray = [Int]()    // var intArray = Array<Int>()
  2. var shorthandDictionary = [String:Int]()    // var creditDictionary = Dictionary<String,Int>()

如上所示,对于数组类型来说,只需在中括号中声明数组的类型,接着再跟一对小括号即可(小括号里也可带有初始化的参数,比如[Int]
(count:3,repeatedValue:0)
),对于字典类型来说,只需再中括号中声明key和value的类型,并以冒号分隔即可,接着再跟一对小括号,同理,小括号里也可带有相应初始化方法的参
数。另外一种情况是,如果已知某个变量为集合类型,那么再次赋值时可以采用更简单的形式:

  1. shorthandArray = [] // empty array
  2. shorthandDictionary = [:]   // empty dictionary

由于类型已知,因此无需在中括号中声明相应的类型。

五.集合类型的遍历

集合类型最常用的操作莫过于遍历集合。下面分别针对数组和字典进行遍历:

  1. var carArray = [String]()
  2. carArray.append("Mercedes-Benz")
  3. carArray.append("Toyota")
  4. carArray.append("Porsche")
  5. for car in carArray {
  6. println(car)
  7. }

上面的例子中采用for in 循环,循环打印数组中每个元素。(println是swift内置全局函数,类似于java的System.out.println()方法。另外可以看到for循环中无需用小括号包围)

输出结果:

(这水印。。)

如果在循环过程中需要得到索引值,可以使用swift标准库中的全局函数enumerate:

  1. for (index,value) in enumerate(carArray) {
  2. println("index\(index):\(value)")
  3. }

打印结果:

  1. index0:Mercedes-Benz
  2. index1:Toyota
  3. index2:Porsche

接下来是遍历字典:

  1. var animalLegs = [String:Int]()
  2. animalLegs.updateValue(4, forKey: "deer")
  3. animalLegs.updateValue(8, forKey: "crab")
  4. animalLegs.updateValue(2, forKey: "kangaroo")
  5. for (animal,legs) in animalLegs {
  6. println("\(animal) has \(legs)leg(s)")
  7. }

和遍历数组类似,只不过遍历的每一项是一个元组(tuple),该元组包含两个元素,一个是key,一个是value。

六.使用下标(subscript)

数组Array和字典Dictionary可以使用下标的形式进行添加,删除和替换等操作,比如:

  1. var carArray = [String]()
  2. carArray.append("Mercedes-Benz")
  3. carArray.append("Toyota")
  4. carArray.append("Porsche")
  5. carArray[0] = "BMW"  // 奔驰被替换成宝马了 [ replace 操作]
  6. var animalLegs = [String:Int]()
  7. animalLegs.updateValue(4, forKey: "deer")
  8. animalLegs.updateValue(8, forKey: "crab")
  9. animalLegs.updateValue(2, forKey: "kangaroo")
  10. animalLegs["sheep"] = 4     // 添加一个元素
  11. animalLegs["deer"] = nil    // 删除一个元素
  12. animalLegs["crab"] = 6      // 替换元素的值
  13. if let legs = animalLegs["kangaroo"] {
  14. println("kangaroo has \(legs)legs")
  15. } else {
  16. println("not defined")
  17. }

针对数组的操作,下标好像只能进行替换,不能添加元素,也不能删除元素(如果将某个元素设置为nil,需将数组的元素类型设置为optional)。

针对字典的操作则比较齐全,可以进行CRUD。需要特别注意的是,通过下标获取字典某个key的值的时候,返回的类型是ValueType?(即
optional的值类型),可以采用optional binding或者if和!搭配使用提取该值,因为字典中可能不存在该值,从而可能为nil。

七.集合类型的简便初始化

可能是说漏了,但也是最重要的一点,就是如何利用数组和字典的字面量(literal)对变量进行赋值。

  1. var countryArray = ["China","Japan","Russia","India","Canada"]
  2. var festivalDic = ["National's Day":"10-01","Christmas Day":"12-25","New Year":"01-01"]

数组的字面量一般形式是[value,value,value...],字典的一般形式是
[key:value,key:value,key:value,...]。数组和字典的数据类型是通过类型推导(type
inferrence)得出来的,对于数组来说,由于数组里的元素都是String,因此countryArray的数据类型是[String],同
理,festivalDic的数据类型是[String:String]。

最后需要强调一点的是,Array和Dictionary跟OC的NSArray和NSDictionary不同,Array和
Dictionary是值类型(value
type),不是引用类型,因此,Array和Dictionary传值一般都是copy,其原始值不会受到影响:(更具体一点,Array和
Dictionary都是struct类型,String也不例外。)

    1. var original = [1,2,3]
    2. var steal = original
    3. steal.append(4)
    4. original.count // 3
    5. steal.count    // 4

Swift中的集合类型的更多相关文章

  1. Swift 学习- 05 -- 集合类型

    // 集合类型 // swift 提供 Arrays , Sets 和 Dictionaries 三种基本的集合类型用来存储数据 , 数组(Arrays) 是有序数据的集, 集合(Sets)是无序无重 ...

  2. Swift中的Optional类型 (可选类型)与强制解包 ? !

    我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...

  3. Swift中的Void类型与空元祖表达式

    可能有不少Swift开发者会忽略这么一个细节:在Swift中,Void类型其实是一个别名类型,而其真正的类型为(),即一个空元祖(empty tuple)! 这种语言特性给Swift带来了一些比较方便 ...

  4. Java中的集合类型的继承关系图

    Java中的集合类型的继承关系图

  5. Programming In Scala笔记-第十七章、Scala中的集合类型

    本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...

  6. Swift中的指针类型

    Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...

  7. Python中的集合类型分类和集合类型操作符解析

    集合类型    数学上,把set称作由不同的元素组成的集合,集合(set)的成员通常被称作集合元素(set elements).    Python把这个概念引入到它的集合类型对象里.集合对象是一组无 ...

  8. swift中的可选类型

    可选类型也是Swift语言新添加的对象.主要是为了解决对象变量或常量为空的情况.在前面定义的变量和常量都不能为空.里面必须要有值. Swift中的可选类型则允许变量(常量)中没有值(被设为nil).要 ...

  9. Java中的集合类型体系(一)

    Java中的集合类型体系(一) 提问:为什么需要集合? 通常情况下,程序需要根据运行时才知道创建了多少对象.若非程序运行时,而在开发阶段,我们并不知道创建了多少对象,甚至不知道对象的准确类型,为了满足 ...

随机推荐

  1. 今日成长笔记2016-11-18 - 关于java开发

    好久没有写今日成长笔记了,要记得上一次写笔记还是2016-09-05,今天心血来潮,写一写最近发生在自己身上的事情,以后我要坚持每天写日记.我承认自己身上的确或多或少的存在不足,现在把它们抛出来,并记 ...

  2. 【转】Android LCD(四):LCD驱动调试篇

    关键词:android LCD TFTSN75LVDS83B  TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...

  3. DOTween 模仿NGUI Tween

    最近再做一个小的项目,只要使用的是DOTween 动画. 但是感到DOTween 在某些方面不如 NGUI的Twenn 比较好用 所以就模仿了一下 在此,请各位大神指点一下 public class ...

  4. Struts2(一)——总体介绍

    这篇博客开始将总结一下有关框架的知识,在开发中合适的利用框架会使我们的开发效率大大提高.当今比较流行的开源框架: 关注数据流程的MVC框架 (Struts1/2, WebWork, Spring MV ...

  5. Calculation(dfs+状压dp)

    Problem 1608 - Calculation Time Limit: 500MS   Memory Limit: 65536KB    Total Submit: 311  Accepted: ...

  6. 编程获取linux的CPU使用的内存使用情况

    Linux可用下top.ps命令检查当前的cpu.mem用法.下面简单的例子: 一.采用ps查看资源消耗的过程 ps -aux 当您查看进程信息,第三列是CPU入住. [root@localhost ...

  7. Ubuntu 系统搭建php服务器 用ssh 远程操作

    一:在桌面下载xshell客户端连接 ,vmavar 上的 Ubuntu系统,遇到的问题跟大家分享一下,希望大家少走弯路 Ubuntu系统默认没有ssh server 要安装 apt-get inst ...

  8. Ribbon1: 在Office菜单中添加项目

    Office菜单就是应用程序窗口左上角的一个小的应用程序按钮,这个按钮被称作Office按钮,包含一些通用的操作或命令,例如打印.保存和发布.定制Office菜单时,其下的命令将影响整个文档,而不是文 ...

  9. Ubuntu安装中文字体

    Ubuntu没有宋体,楷体之类的中文字体,在Libreoffice中打不出中文,-_-! 我们可以从windows中借点字体过来,哈哈. 一.准备字体 从windows7中拷贝出字体文件,拷贝的目录为 ...

  10. [Effective C++系列]-为多态基类声明Virtual析构函数

    Declare destructors virtual in polymorphic base classes.   [原理] C++指出,当derived class对象经由一个由base clas ...