Lynch’s Law says
"when the going gets tough, everyone leaves."
"当事情变得艰难时,所有人都会离开。"
今天要学习具有多个值或不那么简单的复杂类型。
1. Arrays
数组是存储单个值的值的集合。
let john = "John Lennon"
let paul = "Paul McCartney"
let george = "George Harrison"
let ringo = "Ringo Starr"
let beatles = [john, paul, george, ringo]
我们可以这样读取某个值。
beatles[1]
注意:读取不存在的项目时,Swift会崩溃。
使用类型注释时,类型写在方括号内, [String],[Int],[Double],和[Bool]
Question: 为什么Swift有数组?
数组可以存储多个值。
Swift中的数组可以根据需要变换大小,可以添加,删除,重新排列数据。
数值位置从0开始计数。
读取数组无效的索引时应用崩溃,这会帮助我们找到错误
2.Sets
集合也是值的集合,像数组一样,它们区别在于
1.元素不会以任何顺序存储,而是以有效的随机顺序存储。
2.所有的元素必须唯一。
let colors = Set(["red", "green", "blue"])
let colors2 = Set(["red", "green", "blue", "green", "blue"])
重复项被忽略。
Question: 为什么Swift中的集合和数组不同?
集合是无序的,不能包含重复项
数组是有序的,可以包含重复项
由于集合是无序的,所以我们可以对它进行快速检索,如“集合包含X”,无论集合多大,都可以瞬间获得答案。
而数组,要从第一个开始直到找到为止或者没找到。
3.Tuples
元组可以将多个值存储在一个值中。像数组,但不同的是:
1.不能在元组中添加或删除项目;大小固定的。
2.无法更改元组的项目类型;它们一直是创建时的类型。·
3.使用数字位置或命名,来访问元组中的元素,但是Swift不允许读取不存在的数字或名称。
var name = (first: "Taylor", last: "Swift")
name.0
name.first = "Justin"
元组与Swift中的数组有何不同?
假设我们要存储网站
var website = (name: "Apple", url: "www.apple.com")
var website = ["Apple", "www.apple.com"]
元组我们可以,这样访问website.name
和website.url
而数组需要website[0]
和website[0]
。数组是可变的,可以容纳任意数量的字符串。
var person = (name: "Paul", age: 40, isMarried: true)
元组还可以提供类型,这在数组中可能有点难看。
后面要学习的字典提供了某些名称安全性,也可以像数组一样增加和更改,”某些名称安全性“需要我们处理返回的可选值。
4.数组vs集合vs元组
什么时候应该在Swift中使用数组,集合或元组?
数组保持顺序,可以有重复项,集合是无序的,不能有重复项,并且元组内部具有固定类型的固定值。
因此:
1.如果要在字典中存储所有单词,并且没有重复项,顺序也不重要,可以选集合。
2.如果想存储所有文章阅读的用户,只关心有没有读过,可以用集合,如果还有其它需要,可以用数组。
3.如果要存储游戏的高分列表,顺序很重要,并且可能包含重复,那么要用数组。
4.如果要存储代办事项,顺序可预测时最好,那么要使用数组。
5.如果要精确容纳两个字符串,或者整数,或者其它对象,那么该使用元组。
5.Dictionaries
let heights = [
"Taylor Swift": 1.78,
"Ed Sheeran": 1.73
]
读取数据
heights["Taylor Swift"]
Swift为什么有字典和数组?
字典让我们用key来标识添加的项目,数组用序号。
因此我们通过写user["country"]
就可以访问。
像集合一行,字典也是无序的,所以也可以快速检索。
与元组不同,字典中的key可能不存在,所以从字典中读取value可能不会返回任何内容。
6.Dictionary default values
let favoriteIceCream = [
"Paul": "Chocolate",
"Sophie": "Vanilla"
]
favoriteIceCream["c", default: "unknown"]
当字典缺少key时,返回默认的''unknown''。
是否需要默认值,取决于你的需求。
7.Creating empty collections
Collections 数组集合字典都称为集合
创建一个空集合,只需要写出类型后面加上()即可,例如:
var teams = [String: String]()
var results = [Int]()
var words = Set<String>()
Swift中的[]对字典和数组有特殊的语法,其它类型创建必须使用<>。
var scores = Dictionary<String, Int>()
var results = Array<Int>()
实际上数组和字典也可以用<>来创建。
8.Enumerations
枚举,一种定义一组相关联的值的方式,更易于使用。
比如我们会定义这样一个值
let result = "failure"
后来有又人定义了类似的值
let result2 = "failed"
let result3 = "fail"
这是三个不同的字符串,含义不同。
如果使用枚举,我们可以这样写:
enum Result {
case success
case failure
}
使用它
let result4 = Result.failure
为什么需要枚举?
比如我们定义了一个Direction枚举,有north,south,east,和west这些值。
我们可以这样使用Direction.north,使用Direction.thatWay时Swift会报错。枚举可以非常简单存储枚举值,创建存储他们的速度也比字符串快的多。
实际上,枚举可以添加很多功能,Swift中的枚举,比任何其它语言都强大。
9.Enum associated values
枚举除了存储简单值外,枚举还可以存储每种情况的关联值,你可以将这些信息附加到枚举值,代表更多细微差别的数据。
enum Activity {
case bored
case running(destination: String)
case talking(topic: String)
case singing(volume: Int)
}
let talking1 = Activity.talking(topic: "English")
let talking2 = Activity.talking(topic: "Chinese")
10.Enum raw values
枚举原始值
// Int类型的原始值
enum Planet: Int {
case mercury
case venus
case earth
case mars
}
Swift自动为每个值分配一个数字,通过该数字可以创建枚举实例
let earth = Planet(rawValue: 2)
enum Planet: Int {
case mercury = 1
case venus
case earth
case mars
}
如果指定特定的值,Swift会生成其余的案例
为什么Swift的枚举有原始值?
如果我们只是使用枚举的值,那么这比存储为字符串更安全,有效。
如果我们需要读取用户保存的枚举数据,或者从internet下载某些数据,那么我们该如何发送这个值呢?
Swift附加了枚举原始值,使我们可以像平常一样使用,但意味着我们可以用特定的方式来引用每个值。
enum Mood: Int {
case happy
case sad
case grumpy
case sleepy
case hungry
}
比如我们从服务器下载了用户的心情为0, 这时候可以匹配为Mood.happy。
11.总结
1.数组、集合、元组、字典 让你在单个值下存储一些item,他们以不同的方式执行,使用哪种方法取决于所需的行为。
2.数组按顺序存储,并使用数字位置访问它们。
3.集合没有顺序,不能使用数字位置访问。
4.元组大小固定,每个item可以附加名称,你可以使用数组位置或名称来读取。
5.字典根据键值来存储,可以根据键来读取value.
6.枚举是对value分组的一种方式,因为你可以使用他们,并且不会出现拼写错误。
7.枚举可以附加原始值,以便从整数或字符串创建,还可以添加关联值来存储每种情况的其他信息。
网友评论