【Swift官方文档】7.Swift集合类型
集合类型
使用数组、集合和字典来组织数据。Swift 提供了三种主要的集合类型:数组、集合和字典,用于存储值的集合。数组是有序的值集合。集合是无序的唯一值集合。字典是无序的键值对集合。
Swift 中的数组、集合和字典始终清晰地指明它们可以存储的值和键的类型。这意味着你无法错误地将不合类型的值插入集合中。这也意味着你可以对从集合中检索到的值的类型充满信心。
注意
Swift 的数组、集合和字典类型是作为通用集合实现的。有关通用类型和集合的更多信息,请参见通用类型。
集合的可变性
如果你创建一个数组、集合或字典,并将其赋值给一个变量,则创建的集合将是可变的。这意味着在创建后你可以通过添加、删除或更改集合中的项目来更改(或修改)该集合。如果将数组、集合或字典赋值给常量,则该集合是不可变的,其大小和内容不能更改。
注意
在所有不需要更改集合的情况下创建不可变集合是一个良好的实践。这样可以使你更容易理解代码,并使 Swift 编译器能够优化你创建的集合的性能。
数组
数组将相同类型的值存储在有序列表中。相同的值可以在数组中多次出现在不同的位置。
注意
Swift 的 Array 类型与 Foundation 的 NSArray 类桥接。
有关在 Foundation 和 Cocoa 中使用 Array 的更多信息,请参见 Array 和 NSArray 的桥接。
数组类型简写语法
Swift 数组的类型完全写作 Array<Element>
,其中 Element
是数组允许存储的值的类型。你还可以将数组的类型简写为 [Element]
。尽管这两种形式在功能上是相同的,但简写形式是首选的,并且在本指南中引用数组类型时使用简写形式。
创建空数组
你可以使用初始化器语法创建特定类型的空数组:
swift
复制代码
var someInts: [Int] = []
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印 "someInts is of type [Int] with 0 items."
注意,someInts
变量的类型从初始化器的类型推断为 [Int]
。
或者,如果上下文已经提供了类型信息,例如函数参数或已经有类型的变量或常量,你可以用空数组字面量(即 []
)创建一个空数组:
swift
复制代码
someInts.append(3)
// someInts 现在包含 1 个类型为 Int 的值
someInts = []
// someInts 现在是一个空数组,但仍然是类型 [Int]
创建带有默认值的数组
Swift 的 Array 类型还提供了一个初始化器,用于创建指定大小的数组,并将所有值设置为相同的默认值。你将适当类型的默认值(称为 repeating
)和该值在新数组中重复的次数(称为 count
)传递给此初始化器:
swift
复制代码
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles 的类型为 [Double],等于 [0.0, 0.0, 0.0]
通过将两个数组相加来创建数组
你可以通过使用加法运算符(+
)将两个兼容类型的现有数组相加来创建一个新数组。新数组的类型是从你相加的两个数组的类型推断出来的:
swift
复制代码
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles 的类型为 [Double],等于 [2.5, 2.5, 2.5]var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles 被推断为 [Double],等于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
使用数组字面量创建数组
你也可以使用数组字面量初始化数组,这是将一个或多个值写为数组集合的简写方式。数组字面量写作一系列值,使用逗号分隔,并被一对方括号包围:
swift
复制代码
[<#value 1#>, <#value 2#>, <#value 3#>]
下面的示例创建了一个名为 shoppingList
的数组来存储字符串值:
swift
复制代码
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList 已初始化为两个初始项
shoppingList
变量被声明为“一个字符串值数组”,写作 [String]
。因为这个特定数组指定了值的类型为 String
,所以它只允许存储字符串值。在这里,shoppingList
数组使用两个字符串值("Eggs" 和 "Milk")初始化,并写在数组字面量中。
注意
shoppingList
数组被声明为一个变量(使用 var
引导词),而不是常量(使用 let
引导词),因为在下面的示例中会向购物清单中添加更多项目。
在这个情况下,数组字面量只包含两个字符串值,没有其他内容。这与 shoppingList
变量的声明类型(一个只能包含字符串值的数组)相匹配,因此将数组字面量赋值给 shoppingList
是被允许的,以初始化 shoppingList
的两个初始项。
得益于 Swift 的类型推断,如果你使用一个包含相同类型值的数组字面量来初始化数组,则不必写出数组的类型。shoppingList
的初始化可以写得更短:
swift
复制代码
var shoppingList = ["Eggs", "Milk"]
因为数组字面量中的所有值都是相同类型,Swift 可以推断出 [String]
是 shoppingList
变量的正确类型。
访问和修改数组
你可以通过其方法和属性,或者使用下标语法访问和修改数组。
要找出数组中的项数,可以检查其只读的 count
属性:
swift
复制代码
print("The shopping list contains \(shoppingList.count) items.")
// 打印 "The shopping list contains 2 items."
使用布尔值的 isEmpty
属性作为检查 count
属性是否等于 0 的快捷方式:
swift
复制代码
if shoppingList.isEmpty {print("The shopping list is empty.")
} else {print("The shopping list isn't empty.")
}
// 打印 "The shopping list isn't empty."
你可以通过调用数组的 append(_:)
方法向数组的末尾添加新项:
swift
复制代码
shoppingList.append("Flour")
// shoppingList 现在包含 3 项,有人正在做煎饼
或者使用加法赋值运算符(+=
)附加一个或多个兼容项的数组:
swift
复制代码
shoppingList += ["Baking Powder"]
// shoppingList 现在包含 4 项
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList 现在包含 7 项
使用下标语法检索数组中的值,传递你想检索的值的索引,立即在数组名称后面的方括号中:
swift
复制代码
var firstItem = shoppingList[0]
// firstItem 等于 "Eggs"
注意
数组中的第一个项的索引为 0,而不是 1。Swift 中的数组总是以零为索引。
你可以使用下标语法更改给定索引处的现有值:
swift
复制代码
shoppingList[0] = "Six eggs" // 列表中的第一个项现在等于 "Six eggs",而不是 "Eggs"
当你使用下标语法时,指定的索引需要是有效的。例如,尝试写 shoppingList[shoppingList.count] = "Salt"
以尝试将项追加到数组末尾会导致运行时错误。
你还可以使用下标语法一次更改一系列值,即使替换的值集合的长度与要替换的范围不同。以下示例用 "Bananas" 和 "Apples" 替换 "Chocolate Spread"、"Cheese" 和 "Butter":
swift
复制代码
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList 现在包含 6 项
要在指定索引处插入项,请调用数组的 insert(_:at:)
方法:
swift
复制代码
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList 现在包含 7 项
// "Maple Syrup" 现在是列表中的第一项
此调用 insert(_:at:)
方法在购物清单的最前面插入一个值为 "Maple Syrup" 的新项,索引为 0。
同样,你可以使用 remove(at:)
方法从数组中删除项。此方法删除指定索引处的项,并返回该项的值:
swift
复制代码
let removedItem = shoppingList.remove(at: 0)
// removedItem 等于 "Maple Syrup"
// shoppingList 现在包含 6 项,"Maple Syrup" 已被移除
你还可以使用 removeLast()
方法从数组末尾删除最后一个项:
swift
复制代码
let lastItem = shoppingList.removeLast()
// lastItem 等于 "Apples"
// shoppingList 现在包含 5 项
遍历数组
可以使用 for
循环来遍历数组中的每个项。Swift 的 for-in
循环可以用来遍历数组中的每个项:
swift
复制代码
for item in shoppingList {print(item)
}
// 打印 "Six eggs"
// 打印 "Flour"
// 打印 "Baking Powder"
// 打印 "Bananas"
// 打印 "Cheese"
如果你还想获得每个项的索引,可以使用 enumerated()
方法与 for-in
循环一起使用:
swift
复制代码
for (index, item) in shoppingList.enumerated() {print("Item \(index + 1): \(item)")
}
// 打印 "Item 1: Six eggs"
// 打印 "Item 2: Flour"
// 打印 "Item 3: Baking Powder"
// 打印 "Item 4: Bananas"
// 打印 "Item 5: Cheese"
集合
集合是一种无序的、唯一的值集合。集合中的值不能重复,这使得它们在需要确保值唯一的情况中非常有用。集合中的值可以是任何 Hashable 类型的值(例如字符串、数字或自定义结构体)。有关 Hashable 的更多信息,请参见集合。
注意
Swift 的 Set 类型与 Foundation 的 NSSet 类桥接。
集合类型简写语法
Swift 中的集合类型完全写作 Set<Element>
,其中 Element
是集合允许存储的值的类型。可以将集合类型简写为 Set<Element>
。
创建空集合
可以使用初始化器语法创建特定类型的空集合:
swift
复制代码
var letters = Set<Character>()
print("letters 是一个空的 Set<Character>,包含 \(letters.count) 项")
// 打印 "letters 是一个空的 Set<Character>,包含 0 项"
你也可以用集合字面量创建一个特定类型的集合。例如,下面的示例创建一个字符的集合:
swift
复制代码
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 的类型为 Set<String>
你也可以使用字面量创建一个包含数字的集合:
swift
复制代码
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 的类型为 Set<String>
集合操作
可以使用多个方法和属性来操作集合,包括获取元素的数量、添加和删除元素等。与数组类似,集合也有一个只读属性 count
,可以找到集合中项的数量:
swift
复制代码
print("I have \(favoriteGenres.count) favorite music genres.")
// 打印 "I have 3 favorite music genres."
你可以使用 insert(_:)
方法向集合中添加新项:
swift
复制代码
favoriteGenres.insert("Jazz")
// favoriteGenres 现在包含 4 项
要从集合中删除项,可以使用 remove(_:)
方法:
swift
复制代码
if let removedGenre = favoriteGenres.remove("Rock") {print("\(removedGenre) 已从集合中移除。")
} else {print("集合中没有 Rock。")
}
// 打印 "Rock 已从集合中移除。"
要检查集合中是否包含某个项,可以使用 contains(_:)
方法:
swift
复制代码
if favoriteGenres.contains("Funk") {print("我喜欢 Funk。")
} else {print("我不喜欢 Funk。")
}
// 打印 "我不喜欢 Funk。"
遍历集合
与数组一样,可以使用 for-in
循环遍历集合中的每个项。尽管集合是无序的,但每次遍历的结果都可以相同:
swift
复制代码
for genre in favoriteGenres {print(genre)
}
// 结果无序,可能打印 "Classical"、"Hip hop"、"Jazz"
字典
字典是无序的键值对集合。字典中的每个值都通过其唯一的键进行访问。字典的键是唯一的,不能重复。
注意
Swift 的 Dictionary 类型与 Foundation 的 NSDictionary 类桥接。
字典类型简写语法
Swift 中的字典类型完全写作 Dictionary<Key, Value>
,其中 Key
是字典中键的类型,Value
是字典中值的类型。你可以将字典的类型简写为 [Key: Value]
。
创建空字典
可以使用初始化器语法创建特定类型的空字典:
swift
复制代码
var namesOfIntegers = [Int: String]()
print("namesOfIntegers 是一个空的 [Int: String] 字典,包含 \(namesOfIntegers.count) 项")
// 打印 "namesOfIntegers 是一个空的 [Int: String] 字典,包含 0 项"
创建字典
可以使用字典字面量创建字典。例如,下面的示例创建一个包含整数及其名称的字典:
swift
复制代码
var namesOfIntegers = [0: "零", 1: "一", 2: "二"]
注意
Swift 会自动推断字典的类型为 [Int: String]
,因为字典字面量中的键是整数,而值是字符串。
访问和修改字典
与数组和集合一样,可以使用多种方法和属性访问和修改字典。可以使用字典的只读属性 count
查找字典中项的数量:
swift
复制代码
print("namesOfIntegers 现在包含 \(namesOfIntegers.count) 项")
// 打印 "namesOfIntegers 现在包含 3 项"
要访问字典中的值,可以使用下标语法,传入要访问的键的值:
swift
复制代码
let numberName = namesOfIntegers[2]
// numberName 等于 "二"
如果你访问的键在字典中不存在,结果将是 nil
。可以使用可选绑定语法检查:
swift
复制代码
if let numberName = namesOfIntegers[5] {print("数字 5 的名称是 \(numberName)")
} else {print("数字 5 不在字典中。")
}
// 打印 "数字 5 不在字典中。"
要添加或更改字典中的值,可以使用下标语法:
swift
复制代码
namesOfIntegers[1] = "壹"
// namesOfIntegers[1] 现在等于 "壹"namesOfIntegers[4] = "四"
// namesOfIntegers 现在包含 4 项,包括键 4 的新项
要删除字典中的项,可以使用 removeValue(forKey:)
方法:
swift
复制代码
let oldValue = namesOfIntegers.removeValue(forKey: 2)
// oldValue 等于 "二"
// namesOfIntegers 现在只包含 3 项
遍历字典
与其他集合类型相同,可以使用 for-in
循环遍历字典中的每个键值对:
swift
复制代码
for (number, name) in namesOfIntegers {print("\(number): \(name)")
}
// 打印:
// 0: 零
// 1: 壹
// 4: 四
如果你想要以特定顺序访问字典的键,可以使用 keys
属性和排序方法:
swift
复制代码
for number in namesOfIntegers.keys.sorted() {print("\(number): \(namesOfIntegers[number]!)")
}
// 打印:
// 0: 零
// 1: 壹
// 4: 四
相关文章:

【Swift官方文档】7.Swift集合类型
集合类型 使用数组、集合和字典来组织数据。Swift 提供了三种主要的集合类型:数组、集合和字典,用于存储值的集合。数组是有序的值集合。集合是无序的唯一值集合。字典是无序的键值对集合。 Swift 中的数组、集合和字典始终清晰地指明它们可以存储的值…...

QT调用最新的libusb库
一:下载libusb文件 下载最新的库的下载网站:https://libusb.info/ 下载: 解压后目录如下: 二:库文件添加QT中 根据自己的编译器选择库: ①将头文件中添加libusb.h ②源文件中添加libusb-1.0.lib ③添加…...

白嫖EarMaster Pro 7简体中文破解版下载永久激活
EarMaster Pro 7 简体中文破解版功能介绍 俗话说得好,想要成为音乐家,就必须先拥有音乐家的耳朵,相信很多小伙伴都已经具备了一定的音乐素养,或者是说想要进一步得到提升。那我们就必须练好听耳的能力,并且把这种能力…...

使用JavaScript写一个网页端的四则运算器
目录 style(内联样式表部分) body部分 html script 总的代码 网页演示 style(内联样式表部分) <style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0f0f0;}.calculator {…...

Linux find命令详解及实用示例
Linux 系统中的 find 命令是一个功能强大的工具,用于在文件系统中搜索文件并执行相应的操作。无论是系统管理员还是普通用户,掌握 find 命令都能极大地提高工作效率。本文将详细介绍 find 命令的用法,并通过多个示例展示其在实际中的应用。 …...

CSS基础-常见属性(二)
6、CSS三大特性 6.1 层叠性 如果样式发生冲突,则按照优先级进行覆盖。 6.2 继承性 元素自动继承其父元素、祖先元素所设置的某些元素,优先继承较近的元素。 6.3 优先级 6.3.1 简单分级 1、内联样式2、ID选择器3、类选择器/属性选择器4、标签名选择器/…...

Spring Boot 2.4.3 + Java 8 升级为 Java 21 + Spring Boot 3.2.0
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Spring Boot 2.4.3 + Java 8 升级为 Java 21 + Spring Boot 3.2.0前言更换 Java 21 SD…...

如何利用免费音频剪辑软件制作出精彩音频
现在有许多免费的音频剪辑软件可供选择,它们为广大用户提供了丰富的功能和便捷的操作体验,让音频编辑变得更加轻松和有趣。接下来,让我们一起走进这些免费音频剪辑软件的世界,探索它们的独特魅力和强大功能。 1.福昕音频剪辑 链…...

安宝特分享 | AR技术重塑工业:数字孪生与沉浸式培训的创新应用
在数字化转型的浪潮中,AR(增强现实)技术与工业的结合正在呈现新的趋势和应用延伸。特别是“数字孪生”概念的崛起,为AR技术在工业中提供了独特而创新的切入点。 本文将探索AR如何与数字孪生、沉浸式体验和实用案例相结合…...

专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
目录 搜索 vs 深度优先遍历 vs 深度优先搜索 vs 宽度优先遍历 vs 宽度优先搜索 vs 暴搜 1.深度优先遍历 vs 深度优先搜索(dfs) 2.宽度优先遍历 vs 宽度优先搜索(bfs) 2.关系图暴力枚举一遍所有的情况 3.拓展搜索问题全排列 决策树 1. 计算布尔⼆叉树的值(medi…...

基于springboot vue3 在线考试系统设计与实现 源码数据库 文档
博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…...

什么是 HTTP 请求中的 options 请求?
在 Chrome 开发者工具中的 Network 面板看到的 HTTP 方法 OPTIONS,其实是 HTTP 协议的一部分,用于客户端和服务器之间进行“预检”或“协商”。OPTIONS 请求的作用是让客户端能够获取关于服务器支持的 HTTP 方法和其他跨域资源共享 (CORS) 相关的信息&am…...

[图形学]smallpt代码详解(1)
一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍,和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…...

Vite多环境配置与打包:
环境变量必须以VITE开头 1.VITE_BASE_API: 在开发环境中设置为 /dev-api,这是一个本地 mock 地址,通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA: 设置为 "true",表示启用调试工具,通常是为了…...

git维护【.gitignore文件】
在工程下添加 .gitignore 文件【git忽略文件】 *.class .idea *.iml *.jar /*/target/...

【Canvas与色彩】十六等分多彩隔断圆环
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>隔断圆环Draft5十六等分多彩</title><style type"text…...

什么是pip? -- Python 包管理工具
前言 不同的编程语言通常都有自己的包管理工具,这些工具旨在简化项目的依赖管理、构建过程和开发效率,同时促进代码的复用和共享。每个包管理工具都有其独特的特点和优势,开发者可以根据自己的编程语言和项目需求选择合适的包管理工具。 pip是…...

FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解
一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时,有时需要通过枚举的方式来限定参数只能为某几个值中的一个,这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下: #引入Enum模块 from fa…...

OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试
OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,有的问题未解决,新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…...

前沿论文创新点集合
系列文章目录 文章目录 系列文章目录一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》二、《MaPLe: Multi-modal Prompt Learning》三、《Learning to Prompt for Vision-Language Models》CoOp四、《MobileCLIP: Fast Image-Text Models through Multi-Modal R…...

刷题记录(好题)
Problem - D - Codeforces 思路: 滑动窗口思想,一个数组记录起始点(记录出现过的次数),另一个数组记录截至点(记录出现过的次数),从0开始遍历,设定一个长度为d的滑动窗口…...

【大数据入门 | Hive】函数{单行函数,集合函数,炸裂函数,窗口函数}
1. 函数简介: Hive会将常用的逻辑封装成函数给用户进行使用,类似于Java中的函数。 好处:避免用户反复写逻辑,可以直接拿来使用。 重点:用户需要知道函数叫什么,能做什么。 Hive提供了大量的内置函数&am…...

python sqlite3 工具函数
起因, 目的: sqlite3 最常用的函数。 比如,某人给了一个 database.db 文件。 但是你登录的时候,不知道账号密码。 此文件就是,查看这个数据库的详细内容。 有哪些表某个表的全部内容。添加数据 代码, 见注释 impor…...

顺丰Android面试题集锦及参考答案
TCP 三次握手和四次挥手是什么,挥手过程中主动方的状态是什么? TCP 三次握手是建立连接的过程: 第一次握手:客户端向服务器发送一个 SYN 报文,该报文包含客户端的初始序列号(seq=x)。此时客户端进入 SYN_SENT 状态。第二次握手:服务器收到客户端的 SYN 报文后,向客户端…...

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app
uniapp一个很是用的功能,就是在我们发布新版本的app后,需要提示用户进行app更新,并告知用户我们新版的app更新信息,以使得用户能及时使用上我们新开发的功能,提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…...

Python爬虫通过 Cookie 和会话管理来维持其在网站上的会话状态
Python 爬虫虽然是一个热门且非常实用的技术领域,但在实际开发中,确实存在一些困难的地方。以下是 Python 爬虫开发中常见的难点和挑战: 1. 处理反爬虫机制 许多网站为防止爬虫的恶意访问,采取了各种反爬虫措施。常见的反爬虫技…...

使用STM32单片机实现无人机控制系统
无人机控制系统是无人机的大脑,负责处理无人机的姿态控制、导航和通信等功能。本文将详细介绍如何使用STM32单片机实现无人机控制系统,包括硬件设计、软件设计、系统调试与测试等内容。 一、系统概述 无人机控制系统通常包括飞行控制器、传感器、执行器…...

【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)
将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路,请移步:https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能:可同时绕X轴和Y轴旋转,两者效果会叠加。 完美适配Web、原生…...

解决nginx+tomcat宕机完美解决方案
问题描述:公司项目太老了,还是tomcat项目,部署两台tomcat,做了nginx负载。最近发现每到上午10,下午3点,tomcat就宕机了,死活找不到原因,客户影响超期差,实在让人头疼。 解决思路&am…...

第十一章 缓存之更新/穿透/雪崩/击穿
目录 一、什么是缓存 二、缓存更新策略 2.1. 缓存主动更新策略 2.1.1. Cache Aside模式(主流) 2.1.2. Read/Write Through模式 2.1.3. Write Behind模式 2.1.4. 总结 三、缓存穿透 四、缓存雪崩 五、缓存击穿 5.1. 互斥锁实现 5.1.1…...