在上一篇文章中 ,您了解了变量,常量和一些常见的数据类型,例如整数,浮点数和字符串。 在本文中,我们将放大集合。 Swift的标准库定义了三种集合类型:集合,数组和字典。 让我们从数组开始。
1.数组
如果您熟悉Objective-C,JavaScript或PHP,那么理解数组就不会困难。 数组是有序的零索引值集合。 但是,Swift和其他编程语言的数组之间有一些重要的区别。
类型
与Objective-C中的数组相比,第一个重要区别是数组中存储的值始终是同一类型。 最初,这似乎是一个重大限制,但实际上并非如此。 实际上,此限制具有重要的优势。 当我们向数组询问其值之一时,我们确切知道返回什么类型。
另一个关键区别是数组可以存储的值的类型。 在Objective-C中,数组只能存储类类型的值。 Swift没有此限制。 Swift中的数组可以存储字符串,整数,浮点数和类实例。 在本系列后面的内容中,当我们讨论类和结构时,这将如何工作,以及在Swift中为何可行。
宣言
尽管有几种创建数组的方法,但需要记住,Swift需要知道打算在数组中存储哪种类型的值。 像在上一篇文章中一样 ,在Xcode中创建一个新的Playground,并将以下几行添加到您的Playground中。
var array1: Array<String>
var array2: [String]
var array3 = ["Apple", "Pear", "Orange"]
第一和第二行的意思是相同的。 第二行只是简写。 包裹String
关键字的方括号告诉Swift,我们正在声明一个只能包含String
对象的数组。
您可以将第一行代码读为:“我们声明了一个名为array1
的变量,其类型为 Array
,只能包含String
对象。” 冒号表示类型 。
第三行向我们展示了如何使用数组文字初始化数组。 数组文字看起来与Objective-C中的数组文字非常相似。 主要区别在于方括号和字符串文字之前没有@
符号。
还有一种花哨的方法可以使用预定义数量的默认值初始化数组。 语法一开始可能会令人困惑,但请花一些时间让它陷入。
var a = [String](repeating: "Test", count: 5)
结果数组包含五个字符串,每个字符串等于"Test"
。 为了更好地理解上述初始化,请看以下两行代码,在其中我们初始化了一个空字符串数组。
var b = Array<String>()
var c = [String]()
如果您仍然感到困惑,请不要担心。 一旦开始处理类和函数,我们将更详细地探讨语法。 在本文中,我们仅关注集合。
变异性
您很快就会体会到的Swift的一方面是如何声明可变集合。 例如,上面的代码片段声明了三个可变数组。 可变数组是使用var
关键字定义的。 就这么简单。
如果您不希望数组是可变的,请改用let
关键字。 Swift的目标是直观且易于使用,其可变性的实现就是该目标的完美示例。
获取和设置值
要访问存储在数组中的值,我们使用与Objective-C中相同的下标语法。 在下面的示例中,我们要求array3
作为其第二个元素,即字符串"Pear"
。
array3[1]
替换存储在索引1
处的值就像使用相同的下标语法分配新值一样简单。 在下面的示例中,将索引1
处的"Pear"
替换为"Peach"
。
array3[1] = "Peach"
这仅是可能的,因为数组是可变的,也就是说,我们使用var
关键字声明了数组。 不可能更改常量数组。 有许多用于处理数组内容的高级技术,但是基本概念是相同的。
合并两个数组就像将它们加在一起一样简单。 在下面的示例中,我们声明并合并两个不可变数组。 请注意,生成的数组c
不需要可变即可工作。
let a = [1, 2, 3]
let b = [4, 5, 6]
let c = a + b
但是,关键是存储在a
和b
中的值必须是同一类型。 现在的原因应该很明显。 如前所述,存储在数组中的值必须是同一类型。 以下示例导致错误。
let a = [1, 2, 3]
let b = [1.5, 5.2, 6.3]
let c = a + b
要将数组追加到可变数组,请使用+=
运算符。 请注意,右侧的操作数是一个数组。 如果我们移除4
周围的方括号,则此操作将无效。
var a = [1, 2, 3]
a += [4]
运作方式
数组是可以在其上执行多种操作的对象。 数组公开了许多函数或方法。 要在对象上调用方法,请使用点表示法。 array3
添加到您的游乐场,以将一个项目添加到array3
。
array3.append("Cherry")
我们通过检查array3
的count
属性的值来查看array3
包含多少项。 这会将4
输出到结果窗格。
array3.count
也可以通过调用数组的insert(_:at:)
方法,在特定的索引处插入项目,如下所示。 insert(_:at:)
方法接受多个参数,并且语法一开始可能看起来有些奇怪。
array3.insert("Prune", at: 2)
与Objective-C一样,Swift支持命名参数以提高可读性。 结果是代码更易于阅读和理解,而函数或方法就其功能而言并不需要太多解释。 显而易见,例如, insert(_:at:)
方法将在索引2
处插入元素。
尽管Swift比Objective-C更简洁,更简洁,但它支持命名参数。 如果您来自PHP,Ruby或JavaScript,那么这肯定需要一些习惯。
便利方法
我真正喜欢Swift的是类似Ruby的便捷属性和Swift标准库的方法。 例如,数组具有isEmpty
属性,该属性告诉您数组是否包含任何元素。 这仅是检查数组的count
属性的简写。 但是,结果是使代码更简洁,更易于阅读。
array3.isEmpty
2.字典
字典的行为与Objective-C中的字典非常相似。 词典存储值的无序集合。 字典中的每个值都与一个键相关联。 换句话说,字典存储许多键/值对。
类型
与数组一样,存储在字典中的键和值必须具有相同的类型。 这意味着,如果您向字典询问特定键的值,则知道该字典将返回哪种类型。
宣言
声明字典类似于声明数组。 区别在于您需要同时指定键和值的类型。 下面的示例显示了三种声明字典的方法。
var dictionary1: Dictionary<String, Int>
var dictionary2: [String: Int]
var dictionary3 = ["Apple": 3, "Pear": 8, "Orange": 11]
第二行是第一行的简写。 这些字典的键必须为String
类型,而值则应为Int
类型。 var
关键字指示字典是可变的。
您可以将第一行代码读为:“我们声明了一个名为dictionary1
的 Dictionary
类型的变量,该变量只能包含String
类型的键和Int
类型的值。”
第三行说明了如何使用字典文字初始化字典。 这类似于我们在Objective-C中使用的语法,但是请注意,花括号被方括号替换,并且文字没有前缀@
符号。
获取和设置值
访问值类似于访问数组的值。 唯一的区别是您使用键而不是需要访问的值的索引。 以下示例说明了这一点。
let value = dictionary3["Apple"]
print(value)
您会注意到Xcode告诉我们value的value
不是3
,而是Optional(3)
。 这是什么意思? Swift使用可选参数包装可以是以下两种情况之一的值:value或nil
。 现在不要担心可选项。 在本系列的下一篇文章中,我们将重点介绍可选内容。 让我告诉你,可选是Swift编程语言的另一个关键概念。
有趣的是,如果字典的键的类型为Int
,则访问字典值的语法与数组的语法相同。 看下面的例子,看看我的意思。
var dictionary4 = [0: "Apple", 1: "Pear", 2: "Orange"]
let fruit = dictionary4[0]
运作方式
与数组一样,Swift标准库定义了可以在字典上执行的多种操作。 您可以通过其count
属性向字典询问键/值对的count
。 删除键/值对既简单又直观,如下面的示例所示。 当然,这仅在字典可变时才可行。
dictionary4.removeValue(forKey: 0)
当您开始学习Swift时,您可能会遇到看起来很奇怪或令人困惑的代码片段。 看一下下面的行,我们首先声明一个字典,然后删除其键/值对。
var dictionary = [String: Int]()
dictionary["Oranges"] = 2
dictionary["Apples"] = 10
dictionary["Pears"] = 5
dictionary = [:]
您必须承认最后一行看起来有些奇怪。 由于Swift知道可以存储在dictionary
中的键和值的类型,因此清空字典就像为其分配空字典一样简单。
在这种情况下,无需指定键和值的类型,因为在第一行中声明字典时我们已经这样做了。 这指出了另一个重要的细节,即,在声明集合之后,可以存储在数组和字典中的值的类型不能更改。
3.套
集与数组非常相似,因为它们存储相同类型的值的集合。 但是有几个重要的区别。 集合中存储的元素是无序的,并且每个项目在集合中只能出现一次。
宣言
使用集合与使用数组有点不同。 看看下面的示例,其中我们声明了三个集合。 set1
变量的类型为Set<String>
,该集合只能包含String
类型的值。
var set1: Set<String>
var set2 = Set<String>()
var set3: Set<String> = ["Apple", "Pear", "Orange"]
set2
变量是一个空集,在第三个示例中,我们使用数组文字来创建和填充包含三个值的可变集。 由于Swift的类型推断,我们可以省略集合的类型。
var set3: Set = ["Apple", "Pear", "Orange"]
操作集
使用集合类似于使用数组。 我们可以通过检查集合的count
属性来询问集合中存储的元素count
。
set3.count
插入元素很容易。 由于集合中的元素是无序的,因此我们无需指定新元素的位置。
set3.insert("Prune")
从集合中删除元素也是如此。
set3.remove("Orange")
您还可以询问集合是否包含特定元素。
set3.contains("Apple")
数组或集合
我经常将集合称为数组的轻量级版本。 如果元素的顺序并不重要,或者您想确保每个元素在集合中只能出现一次,则可以使用集合。
4.元组
您将爱元组。 元组不是集合,但是像集合一样,它们也将多个值组合在一起。 与数组和字典相似,元组可以包含任何类型的值。 但是,关键的区别在于存储在元组中的值不必是同一类型。 让我们看一个示例,以更详细地说明这一点。
import Foundation
var currency = ("EUR", 0.81)
var time = (Date(), "This is my message.")
var email = ("Bart Jacobs", "bart@example.com")
第一个示例声明一个类型为(String, Int)
名为currency
的元组。 第二个元组time
包含一个Date
实例和一个字符串文字。 email
中存储的值都是String
类型的,这意味着email
的类型是(String, String)
。
访问值
指标
要访问存储在元组中的值,请使用与您感兴趣的值相对应的索引。
var rate = currency.1
var message = time.1
var name = email.0
Xcode向我们显示了右侧游乐场的结果窗格中存储在元组中的每个值的索引。
![在操场上的元组](https://i-blog.csdnimg.cn/blog_migrate/4614aa985297f611d94ac0bf02309d22.png)
名字
为了提高可读性,您可以命名存储在元组中的值。 结果是您可以通过它们的名称而不是它们的索引访问元组的值。 在这种情况下,声明元组略有不同。
var currency = (name: "EUR", rate: 0.81)
let currencyName = currency.name
let currencyRate = currency.rate
分解
还有第二种更优雅的方式来处理存储在元组中的值。 看下面的示例,其中我们分解了currency
的内容。
let (currencyName, currencyRate) = currency
的值currency
在索引0
被存储在currencyName
,在索引值1
被存储在currencyRate
。 无需指定currencyName
和currencyRate
的类型,因为Swift可以从currency
存储的值推断出类型。 换句话说, currencyName
的类型为String
, currencyRate
的类型为Float
。
如果您仅对元组的特定值感兴趣,则可以使用下划线告诉Swift您对哪些值不感兴趣。
let (currencyName, _) = currency
结论
数组和字典是几乎每种编程语言的基本组成部分,而Swift也不例外。 尽管集合在Swift中的行为略有不同,但是如果您使用其他编程语言中的数组和字典,那么很快就会熟悉Swift的集合类型。 在下一个教程中,我们将探讨可选内容和控制流程。
无论您是刚刚开始使用基础知识还是想探索更高级的主题,我们都构建了完整的指南来帮助您学习Swift 。
翻译自: https://code.tutsplus.com/tutorials/swift-from-scratch-collections-and-tuples--cms-22832