集合类型(Collection Type)

Swift提供三种主要的集合类型:数组(array)、集合(set)、字典(dictionary)。数组是有序的值序列,集合是无序的值序列,字典是无序的键值对序列。这三个类型都要求显示指定存储值的类型。因此不能把不同类型的值增加到它们中。

如果创建的集合类型并赋值给一个变量而非常量,那么它就是可以改变的。如果是赋值给一个常量,那么它就是不可改变的。这和OC中是有区别的,OC是在创建的时候就需要用不同的类来创建实例来确定是否可变。尽管如此,在确定该变量应该不可改变或者不会改变的时候,尽量赋值给常量使它不可改变。

Swift中的array,set,dictionary都是被实现为通用集合(generic collection)的。通用(generi)是Swift的一个特性,通用代码允许用户创建灵活可重用的函数或者类型,它可以避免重复开发,比如你可以创建一个数组,它可以包含Int类型,或者是String,或者是其他类型,你不需要在一开始就特别制定它的类型。generi特性在后面会专门介绍。

数组

数组是用来有序存储一系列同类型的值的数据类型。Swift的array是和Foundation的NSArray相通的。数组中的元素可以是重复的。

数组类型简写

Swift的数组类型全写是Array<SomeType>,也可以将数组的类型简写为[SomeType]。尽管两种方式是相通的,但是简写方式是被推荐的。

可以用初始化语法创建一个指定类型的空数组:

var someInts = [Int]()
println("someInts is of type [Int] with \(someInts.count) items.")
// prints "someInts is of type [Int] with 0 items.”

注意someInts的类型就通过初始化器设定为了Int。

同时,如果上下文已经明确了它的数据类型,比如函数传递的参数或者是已经确定类型的变量/常量,此时可以用空数组字面量来创建空数组,而无需指明类型,接上个例子:

someInts.append()
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]

Swift的数组也提供另一个初始化器,可以用来创建指定长度的数组,数组的元素都初始化为给定的默认值。通过向初始化器传递长度和默认值两个参数来创建,如下:

var threeDoubles = [Double](count: , repeatedValue: 0.0)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

可以用+号将两个已经存在的并且类型合适的数组连接起来从而创建一个新数组。接上一个例子:

var anotherThreeDoubles = [Double](count: , repeatedValue: 2.5)
// anotherThreeDoubles is inferred as [Double], and equals [2.5, 2.5, 2.5] var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

也可以通过数组字面量来创建一个新数组,比如:

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items

注意这里的变量类型写法,表示shoppingList是一个存储String的数组。

你可能还没忘记前面介绍到的Swift的类型侦测,这里你如果是用数组字面量来创建数组,根据你给出的元素,编译器就能够推断出数据类型了,你不需要显示地指定数组类型,比如:

var shoppingList = ["Eggs", "Milk"]

操作数组

可以通过下标语法或者属性方法来操作数组。

count只读属性给出数组当前的长度。

isEmpty属性是布尔值,其实就是检查count是否为0的简写。

append(_:)方法用来向变量数组追加元素,当然,也可以用+=的方式来向数组追加元素。

shoppingList += ["Chocolate Spread", "Cheese", "Butter"]

同其他语言一样,可以通过下标语法来检索数组元素,这里一点特殊的是,Swift中,下标语法允许指定一个范围,而不仅仅是一个值,比如:

shoppingList[...] = ["Bananas", "Apples"] 

注意这里,指定的范围其实是三个,而传入的数组只有两个元素,这是允许的,这时数组shoppingList含有6个元素而非7个,原有数组的4 5 6位的元素被替换为了"Bananas"  "Apples"两个元素。

注意:不能通过下标语法来给数组末尾追加元素。

insert(_:atIndex:)用来向数组的指定位置插入一个元素:

shoppingList.insert("Maple Syrup", atIndex: )
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list

removeAtIndex(_:)用来删除指定位置的一个元素,并将它返回:

let mapleSyrup = shoppingList.removeAtIndex()
// the item that was at index 0 has just been removed
// shoppingList now contains 6 items, and no Maple Syrup
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string”

显而易见地,此方法要求传入的参数必须在数组的范围内,如果超出范围则会触发运行时错误。删除一个元素后,其他元素会改变位置来填补空白,数组长度也就发生了变化。

removeLast()方法用来删除数组的最后一个元素并将其返回。

遍历数组

用for-in遍历数组

for item in shoppingList {
println(item)
}

如果你同时需要获得索引序号和值,用全局的枚举函数enumerate在数组上循环,全局枚举函数返回一个元组,它由数组中每个元素的序号和值复合组成。然后在这个元组上用for in将其分解。

for (index, value) in enumerate(shoppingList) {
println("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas

集合(Set)

Set用来无序存储一些列相同类型的不同值的元素。当存储元素的顺序并不重要或者为了确保序列中的元素只会出现一次的时候,可以用set取代array。Swift的Set和Foundation中的NSSet是相通的。

Set的数据类型语法是Set<SomeType>,Set并不支持类型语法的简写,这是唯一的方式。

通过初始化器来创建空的Set:

var letters = Set<Character>()
println("letters is of type Set<Character> with \(letters.count) items.")
// prints "letters is of type Set<Character> with 0 items.”

同时,如果上下文已经明确提供了数据类型,比如函数参数或者已经定义的变量/常量,可以通过空的数组字面量来创建空的集合,接上面的例子:

letters.insert("a")
// letters now contains 1 value of type Character
letters = []
// letters is now an empty set, but is still of type Set<Character>

用数组字面量也可以创建含有元素的集合,这可以当做初始化集合的简写形式:

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres has been initialized with three initial items

当然,通过数组字面量的形式时,编译器可以推断出数据类型,因此可以省略掉类型。

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

操作集合

可以通过属性和方法来操作集合。

count只读属性返回集合的元素个数。

isEmpty属性是布尔值,可以当做判断count是否为0的简写。

insert(_:)用于向集合中插入一个元素。

remove(_:)用于从集合中删除一个元素,如果集合包含这个元素,则将其删除,并返回这个元素,如果集合不包含这个元素,则返回nil。

removeAll()删除集合中所有元素。

contains(_:)用于检查集合是否包含指定元素,返回一个布尔值。

遍历集合

像数组一样,用for-in来遍历集合。

因为Set并不是按序存储元素的,要按一定顺序遍历Set里的元素,用全局函数sorted,它返回一个按指定顺序排列好的集合:

for genre in sorted(favoriteGenres) {
println("\(genre)")
}
// prints "Classical"
// prints "Hip hop"
// prints "Jazz”

集合运算

【构建集合】

集合可以快速进行一系列复杂运算,比如合并、获取交集、并集等。

union(_:)返回两个集合并集

intersect(_:)返回两个集合交集

subtract(_:)返回属于第一个集合且不属于第二个集合的元素集

exclusiveOr(_:)返回两个集合各自拥有的不同的元素集,即intersect(_:)的补集

let oddDigits: Set = [, , , , ]
let evenDigits: Set = [, , , , ]
let singleDigitPrimeNumbers: Set = [, , , ]
sorted(oddDigits.union(evenDigits))
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sorted(oddDigits.intersect(evenDigits))
// []
sorted(oddDigits.subtract(singleDigitPrimeNumbers))
// [1, 9]
sorted(oddDigits.exclusiveOr(singleDigitPrimeNumbers))
// [1, 2, 9]

【集合比较】

==用于判断两个集合是否包含完全相同的元素

isSubsetOf(_:)判断是否一个集合的所有元素都被包含在另一个元素中

isSupersetOf(_:)判断是否一个集合包含了另一个集合的所有元素

isStrictSubsetOf(_:)和isStrictSupersetOf(_:)与上述两个方法类似,不过它们确保两个集合在满足条件的同时且不相等

isDisjointWith(_:)判断两个集合是否包含相同的元素,如果存在则返回false

let houseAnimals: Set = ["												

Swift学习笔记六的更多相关文章

  1. swift学习笔记(六)析关闭过程和使用分配给属性的默认值

    一.通过关闭和功能的默认实现财产值 当存储属性默认值需要定制,能为客户提供通过关闭或全局函数的自定义默认值. 注意:全局函数的结构,和枚举使用keywordstatic大喊    用classkeyw ...

  2. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  8. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  9. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

随机推荐

  1. Java中的的XML文件读写与DOM

    XML简介 要理解XML,HTML等格式,先来理解文档对象模型DOM 根据 DOM,HTML 文档中的每个成分都是一个节点,这些节点组成了一棵树.DOM 是这样规定的:整个文档是一个文档节点每个 HT ...

  2. Banner 广告设计技巧及经验(转自UI中国)

    经常听到banner这个词,但是banner是什么意思呢?引用百度知道的解释:banner可以作为网站页面的横幅广告,也可以作为游行活动时用的旗帜,还可以是报纸杂志上的大标题.Banner主要体现中心 ...

  3. Delphi DecodeDate和EncodeDate 拆分和聚合时间函数的用法

    SysUtilsprocedure DecodeData(Date: TDateTime; var Year, Month, Day: Word);DecodeDate打断TdateTime成为年月日 ...

  4. Android 生成含签名文件的apk安装包

    做android开发时,必然需要打包生成apk文件,这样才能部署.作为一个完善的apk,必然少不了签名文件,否则下次系统无法进行更新. 一.签名文件的制作及打包生成APK文件 签名文件比较流行的制作方 ...

  5. XCode修改工程名注意

    以下文字转载过来,在使用的过程中遇到几个问题 1.需要在 Build phases 里面,检查下 Link Binary With Libraries 以及Compline Sources 2.Bul ...

  6. Android应用启动时间及启动日志获取方法

    1. Android应用中,可以使用如下方式进行应用启动时间的查看 2. 启动日志获取方法:

  7. JSP中字符编码转换问题

    问题描述:一个input.jsp页面中的参数,传递到另外一个save.jsp页面上,然后存入到数据库中,如果input.jsp页面输入偶数中文没有问题,输入奇数则出现?,存入数据库的也是?. 问题源码 ...

  8. (三)相遇射线的3D碰撞盒

    序 在2D游戏中,我们知道处理碰撞时,需要设置精灵遮罩图.同样,进入3D,处理碰撞时需要3D模型作为“遮罩图”. 索尼克 飞檐走壁   目的 (1)处理模型间的碰撞问题         (2)获取鼠标 ...

  9. oracle检查点checkpoint信息

    1.关于checkpoint的概述 checkpoint是oracle在数据库一致性关闭.实例恢复和oracle基本操作中不可缺少的机制,包含以下相关的含义: A.检查点的位置(checkpoint ...

  10. 写给Python初学者的设计模式入门

    有没有想过设计模式到底是什么?通过本文可以看到设计模式为什么这么重要,通过几个Python的示例展示为什么需要设计模式,以及如何使用. 设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的 ...