Swift基础-数组、字典、集合、枚举

数组(Arrays)

数组是存储为单个值的值的集合。例如,John,Paul,George和Ringo是名字,但是数组使您可以将它们分组为一个名为The Beatles的单一值。

在代码中,我们这样写:

let john = "John Lennon"
let paul = "Paul McCartney"
let george = "George Harrison"
let ringo = "Ringo Starr"

let beatles = [john, paul, george, ringo]

最后一行构成数组:它以方括号开头和结尾,数组中的每个项目均以逗号分隔。

您可以通过在方括号内写一个数字来从数组中读取值。数组位置从0开始计数,因此,如果您想阅读“ Paul McCartney”,可以这样写:

beatles[1]

请注意:如果您阅读不存在的项目,Swift就会崩溃。例如,尝试阅读beatles[9]不是一个好主意。

注:如果您使用类型注释,阵列都写在括号:[String],[Int],[Double],和[Bool]。

集合(Sets)

集合是值的集合,就像数组一样,区别在于它们有两个区别:

  • 1.物品不会以任何顺序存储;它们以有效的随机顺序存储。
  • 2.一组物品不能出现两次。所有项目必须唯一。

您可以直接从数组创建集合,如下所示:

let colors = Set(["red", "green", "blue"])

当您查看colors在Playground输出中的值时,您会发现它与我们用来创建它的顺序不匹配。它不是真正的随机顺序,只是无序的 – Swift不保证其顺序。由于它们是无序的,因此无法像使用数组一样使用数字位置从集合中读取值。

如果您尝试将重复项插入到集合中,则重复项将被忽略。例如:

let colors2 = Set(["red", "green", "blue", "red", "blue"])

最终colors2设置将仅包含红色,绿色和蓝色一次。

元组(Tuples)

元组允许您将多个值一起存储在一个值中。这听起来像数组,但是元组不同:

  • 1.您不能在元组中添加或删除项目;它们的大小是固定的。
  • 2.您无法更改元组中的项目类型;它们始终具有与创建时相同的类型。
  • 3.您可以使用数字位置或命名它们来访问元组中的项目,但是Swift不会让您读取不存在的数字或名称。

通过将多个项目放在括号中来创建元组,如下所示:

var name = (first: "Taylor", last: "Swift")

然后,您可以使用从0开始的数字位置访问项目:

name.0

或者,您可以使用其名称访问项目:

name.first

请记住,创建元组后可以更改其值,但不能更改值的类型。因此,如果您尝试将其更改namebe (first: "Justin", age: 25),则会出现错误。

数组、集合和元组的用法

数组,集合和元组乍一看似乎很相似,但是它们有不同的用途。为了帮助您知道要使用哪个,这里有一些规则。

如果您需要一个特定的,固定的相关值集合,其中每个项目都有一个精确的位置或名称,则应使用一个元组:

let address = (house: 555, street: "Taylor Swift Avenue", city: "Nashville")

如果您需要一个必须唯一的值的集合,或者需要能够非常快速地检查其中是否有特定项目,则应使用一组:

let set = Set(["aardvark", "astronaut", "azalea"])

如果您需要一个可以包含重复项的值的集合,或者项目的顺序很重要,则应使用一个数组:

let pythons = ["Eric", "Graham", "John", "Michael", "Terry", "Terry"]

到目前为止,数组是这三种类型中最常见的。

字典(Dictionary)

字典就像数组一样是值的集合,但是您不必使用整数位置存储东西,而是可以使用所需的任何内容来访问它们。

存储字典数据的最常见方法是使用字符串。例如,我们可以创建一个字典来存储歌手的身高,并使用他们的名字:

let heights = [
    "Taylor Swift": 1.78,
    "Ed Sheeran": 1.73
]

就像数组一样,字典以方括号开头和结尾,并且每个项目都以逗号分隔。但是,我们也使用冒号将要存储的值(例如1.78)与要存储在其下的标识符(例如“ Taylor Swift”)分开。

这些标识符称为key,您可以使用它们从字典中读回数据:

heights["Taylor Swift"]

注意:使用类型注释时,字典用括号括起来,在标识符和值类型之间用冒号表示。例如[String: Double][String: String]

如果您尝试使用不存在的键从字典中读取一个值,Swift将会发回您nil(完全没有)。尽管这可能是您想要的,但是还有另一种选择:我们可以为字典提供一个默认值,以供我们在需要缺少键的情况下使用。

为了演示这一点,让我们为两个人创建一个喜爱的冰淇淋字典:

let favoriteIceCream = [
    "Paul": "Chocolate",
    "Sophie": "Vanilla"
]

我们可以这样阅读保罗最喜欢的冰淇淋:

favoriteIceCream["Paul"]

但是,如果我们尝试阅读夏洛特最喜欢的冰淇淋,则会得到零,这意味着Swift对该键没有任何价值:

favoriteIceCream["Charlotte"]

我们可以通过将字典的默认值设置为“未知”来解决此问题,以便在未找到夏洛特冰淇淋时,返回“未知”而不是nil:

favoriteIceCream["Charlotte", default: "Unknown"]

创建空集合

数组,集合和字典称为集合,因为它们将值集中在一起。

如果要创建一个空集合,只需写出它的类型,然后用括号括起来。例如,我们可以创建一个空字典,其中包含用于键和值的字符串,如下所示:

var teams = [String: String]()

然后我们可以稍后添加条目,如下所示:

teams["Paul"] = "Red"

同样,您可以创建一个空数组来存储整数,如下所示:

var results = [Int]()

例外是创建一个空集合,是通过不同的方式完成的:

var words = Set<String>()
var numbers = Set<Int>()

这是因为Swift仅对字典和数组具有特殊的语法;其他类型必须使用尖括号语法(例如set)。

如果需要,可以使用类似的语法创建数组和字典:

var scores = Dictionary<String, Int>()
var results = Array<Int>()

枚举(Enumerations)

枚举是一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。
例如,如果您想编写一些代码来表示正在执行的某些工作的成功或失败,则可以将其表示为字符串:

let result = "failure"

但是,如果有人不小心使用了不同的命名会怎样?

let result2 = "failed"
let result3 = "fail"

这三个都是不同的字符串,所以它们的含义不同。

使用枚举,我们可以定义一个Result可以为successor 的类型failure,如下所示:

enum Result {
    case success
    case failure
}

现在,当我们使用它时,我们必须选择以下两个值之一:

let result4 = Result.failure

这样可以防止您每次意外使用不同的字符串。

除了存储简单值之外,枚举还可以存储附加到每种情况的关联值。这使您可以将附加信息附加到枚举,以便它们可以代表更多细微差别的数据。

例如,我们可以定义一个存储各种活动的枚举:

enum Activity {
    case bored
    case running
    case talking
    case singing
}

这些枚举值告诉我们说有人在说话,但我们不知道他们在说什么,或者我们可以知道有人正在跑步,但我们不知道他们跑到哪里去。

枚举关联值使我们可以添加以下其他详细信息:

enum Activity {
    case bored
    case running(destination: String)
    case talking(topic: String)
    case singing(volume: Int)
}

现在我们可以更精确了–我们可以说有人在谈论足球:

let talking = Activity.talking(topic: "football")

有时您需要能够为枚举赋值,以便它们具有含义。这使您可以动态创建它们,并以不同方式使用它们。

例如,您可以创建一个Planet枚举,用于存储每种情况的整数值:

enum Planet: Int {
    case mercury
    case venus
    case earth
    case mars
}

Swift会自动为每个数字分配一个从0开始的数字,您可以使用该数字创建适当的枚举大小写的实例。例如,earth将被赋予数字2,因此您可以这样编写:

let earth = Planet(rawValue: 2)

如果需要,可以为一个或多个案例指定一个特定的值,Swift会生成其余的案例。我们认为地球是第二个行星并不是很自然,因此您可以这样写:

enum Planet: Int {
    case mercury = 1
    case venus
    case earth
    case mars
}

现在,Swift将分配1到mercury上,并从那里开始向上计数,这意味着earth现在是第三颗行星。

总结

  • 1.数组,集合,元组和字典可让您在单个值下存储一组项目。它们各自以不同的方式执行此操作,因此您使用哪种方法取决于所需的行为。
  • 2.数组按添加顺序存储项目,并使用数字位置访问它们。
  • 3.集合设置存储项目时没有任何顺序,因此您不能使用数字位置访问它们。
  • 4.元组的大小是固定的,您可以在每个项目中附加名称。您可以使用数字位置或名称来读取项目。
  • 5.词典根据键存储项目,您可以使用这些键读取项目。
  • 6.枚举是对相关值进行分组的一种方式,因此您可以使用它们而不会出现拼写错误。
  • 7.您可以将原始值附加到枚举,以便可以从整数或字符串创建它们,也可以添加关联的值以存储有关每种情况的其他信息。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容