当前位置: 首页 > news >正文

【Swift】集合类型 - 数组、集合、字典

文章目录

  • 集合的可变性
  • 数组
    • 数组类型简写语法
    • 创建空数组
    • 使用默认值创建数组
    • 通过合并两个数组创建一个新数组
    • 使用数组字面量创建数组
    • 访问和修改数组

Swift 提供了三种主要的 集合类型,分别是数组、集合和字典,用于存储值集合。数组是有序的值集合。集合是无序的唯一值集合。字典是无序的键值对关联集合。

集合类型
Swift 中的数组、集合和字典对于它们可以存储的值和键的类型始终是明确的。这意味着你不能错误地将一个类型不匹配的值插入到集合中。同时,这也意味着你可以放心地知道从集合中取出的值的类型。

※注意:
Swift 的数组、集合和字典类型是作为 泛型集合 实现的。 有关泛型类型和集合的更多信息,请参阅 泛型。

集合的可变性

如果您创建一个数组、集合或字典,并将其赋值给一个变量,则创建的集合将是 可变的。这意味着,在创建集合后,您可以通过添加、删除或更改集合中的元素来改变(或称为 变异)集合。如果您将数组、集合或字典分配给常量,则该集合是 不可变的,并且其大小和内容无法更改。

※注意:
在所有不需要更改的情况下,创建不可变集合是一种良好的实践。这样做可以使你更容易理解代码,并使 Swift 编译器能够优化你创建的集合的性能。

数组

数组——将相同类型的值存储在一个有序列表中。相同的值可以在数组中以不同位置多次出现。

※注意:
Swift 的 Array 类型与 Foundation 的 NSArray 类进行了桥接。 有关如何在 Foundation 和 Cocoa 中使用 Array 的更多信息,请参阅相关文档 Bridging Between Array and NSArray。

数组类型简写语法

Swift 数组的类型完整写作 Array<Element>,其中 Element 是数组允许存储的值的类型。你也可以以简写形式 [Element] 来表示数组的类型。虽然这两种形式在功能上是相同的,但简写形式更受欢迎,并且在本指南中提到数组类型时将优先使用这种形式。

创建空数组

您可以使用构造器语法创建某种类型的空数组:

var someInts: [Int] = []
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印 “someInts is of type [Int] with 0 items.“

请注意,someInts 变量的类型根据初始化器的类型推断为 [Int]。

或者,如果上下文已经提供了类型信息,例如函数参数或已经定义类型的变量或常量,你可以使用空数组字面量 [](一对空的方括号)来创建一个空数组:

someInts.append(3)
// someInts 现在包含 1 个类型为 Int 的值
someInts = []
// someInts 现在是一个空数组, 但它仍是 [Int] 类型的

使用默认值创建数组

Swift 的 Array 类型还提供了一个构造器,用于创建特定大小的数组,其所有值都设置为相同的默认值。您向此构造器传递适当类型的默认值(称为 repeating):以及该值在新数组中重复的次数(称为 count):

var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles 的类型是 [Double],并且等于 [0.0, 0.0, 0.0]

通过合并两个数组创建一个新数组

您可以通过使用加法运算符 (+) 将两个具有兼容类型的现有数组相加来创建新数组。新数组的类型是从您相加的两个数组的类型推断出来的:

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]

使用数组字面量创建数组

您还可以使用 数组字面量 来初始化数组,这是将一个或多个值写入数组集合的简写方法。数组字面量以值列表的形式写入,用逗号分隔,用一对方括号括起来:

[<#value 1#>, <#value 2#>, <#value 3#>]

下面的示例创建了一个名为 shoppingList 的数组来存储 String 值:

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList 已经用两个初始项进行了初始化

shoppingList 变量被声明为“字符串值数组”,写作 [String]。由于该数组指定了值类型为 String,因此它只允许存储 String 类型的值。在这里,shoppingList 数组通过数组字面量初始化了两个 String 值(“Eggs” 和 “Milk”)。

※注意:
shoppingList 数组被声明为变量(使用 var 关键字)而不是常量(使用 let 关键字),因为在下面的示例中,更多的商品要被添加到购物清单中。

在这个例子中,数组字面量只包含两个 String 值,且没有其他内容。这与 shoppingList 变量的声明类型(一个只能包含 String 值的数组)相匹配,因此允许使用这个数组字面量来初始化 shoppingList,并包含两个初始项目。

得益于 Swift 的类型推断功能,如果您使用包含相同类型值的数组字面量进行初始化,则无需显式地写出数组的类型。shoppingList 的初始化可以改为以更简短的形式编写:

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

由于数组字面量中的所有值都是相同类型,Swift 可以推断出 [String] 是 shoppingList 变量的正确类型。

访问和修改数组

您可以通过数组的方法和属性或使用下标语法来访问和修改数组。
要找出数组中的项数,可以检查其只读属性 count

print("The shopping list contains \(shoppingList.count) items.")
// 打印 “The shopping list contains 2 items.“

使用布尔值 isEmpty 属性作为检查 count 属性是否等于 0 的快捷方式:

if shoppingList.isEmpty {print("The shopping list is empty.")
} else {print("The shopping list isn't empty.")
}
// 打印 “The shopping list isn't empty.“

您可以通过调用数组的 append(_:) 方法将新元素添加到数组的末尾:

shoppingList.append("Flour")
// shoppingList 现在包含 3 项,而有人正在做煎饼

或者,可以使用加法赋值运算符(+=)将一个或多个兼容项的数组追加到现有数组中:

shoppingList += ["Baking Powder"]
// shoppingList 现在包含 4 项
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList 现在包含 7 项

使用 下标语法 从数组中检索值,在数组名称后面的方括号[]内传递要检索的值的索引:

var firstItem = shoppingList[0]
// firstItem 的值为 “Eggs”

※注意:
数组中的第一项的索引为 0,而不是 1。Swift 中的数组始终是零索引的。

您可以使用下标语法来更改给定索引处的现有值:

shoppingList[0] = "Six eggs"
// 列表中的第一个项现在是 “Six eggs” 而不是 “Eggs”

当您使用下标语法时,您指定的索引需要有效。例如,编写 shoppingList[shoppingList.count] = “Salt” 以尝试将项目追加到数组末尾会导致运行时错误。

您还可以使用下标语法一次更改一个范围的值,即使替换值集的长度与要替换的范围不同。以下示例将 “Chocolate Spread”, “Cheese” 和 “Butter” 替换为 “Bananas” 和 “Apples”:

shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList 现在包含 6 项 ["Six eggs", "Milk", "Flour", "Baking Powder", "Bananas", "Apples"]

要将项目插入数组中指定索引处,请调用数组的 insert(_:at:) 方法:

shoppingList.insert("Maple Syrup", at: 0)
// shoppingList 现在包含 7 项
// ”Maple Syrup“ 现在是列表中的第一项

相关文章:

【Swift】集合类型 - 数组、集合、字典

文章目录 集合的可变性数组数组类型简写语法创建空数组使用默认值创建数组通过合并两个数组创建一个新数组使用数组字面量创建数组访问和修改数组 Swift 提供了三种主要的 集合类型&#xff0c;分别是数组、集合和字典&#xff0c;用于存储值集合。数组是有序的值集合。集合是无…...

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域&#xff0c;传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求&#xff0c;促使企业寻求突破之道。而 3D 视觉定位技术&#xff0c;为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...

操作系统的基本认识

操作系统的感性认识 操作系统这个词可能或多或少听说过&#xff0c;比如windows, linux, macOS。这些其实都是工程师们经过实践后的具象化产物。而操作系统原理这六个字就是操作系统的抽象化&#xff0c;更准确的说&#xff0c;操作系统原理是很理论化的东西。举一个不是很恰当…...

使用pycharm连接远程服务器

使用pycharm连接远程服务器 1.在你的项目里配置 SSH &#xff0c;放到服务器上去跑 主机为服务器的IP地址&#xff0c;输入用户名和密码 配置项目位置、选择编译器 2.设置本地更改代码保存后即上传到服务器 在本地使用 pycharm 调试代码&#xff0c;pycharm 上面的代码更改…...

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本&#xff0c;旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版&#xff0c;能够扫描并生成详细的报告&#xff0c;涵盖用户管理、权限配置…...

apifox创建一个mock接口

1、新建接口 2、选择mock&#xff0c;开启云端mock&#xff1b; 3、新建期望&#xff1b; 4、编辑响应体&#xff1b; 5、快速请求&#xff0c;测试&#xff1b; &#xff08;主要可能是网络问题&#xff0c;也可以自己python mock一个&#xff1b;apifox简单快速&#xf…...

设计一个基础JWT的多开发语言分布式电商系统

在设计一个分布式电商系统时&#xff0c;保证系统的可扩展性、性能以及跨语言的兼容性是至关重要的。随着微服务架构的流行&#xff0c;越来越多的电商系统需要在多个服务间共享信息&#xff0c;并且保证服务的安全性。在这样的场景下&#xff0c;JSON Web Token&#xff08;JW…...

委托(Delegate)与事件(Event)-(上篇)

C#中的委托&#xff08;Delegate&#xff09;是一种类型安全的函数指针&#xff0c;它允许将方法作为参数传递给其他方法&#xff0c;并且可以用来实现回调机制。委托是C#中实现事件处理、异步编程以及面向对象设计模式的重要工具之一。在C#中&#xff0c;委托被定义为引用类型…...

Scala根据身份证前两位数判断地区

方法一 val id "339005200101010928"// 取出id前两位 val province id.substring(0, 2) /*//println(province)if (province "42") {println("湖北")}else if (province "11") {println("北京")}else if (province &qu…...

freeswitch(开启支持视频H264通话)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景介绍: 内部默认是不支持的,视频通话,需要开启模块使用方法: 第一步:进入vars.xml 下面找到global_codec_prefs和outbound_codec_pr…...

启发式搜索算法和优化算法的区别

启发式搜索算法和优化算法在计算机科学中都有广泛的应用&#xff0c;但它们之间存在一些明显的区别。 一、定义与核心思想 启发式搜索算法 定义&#xff1a;启发式搜索算法是一类基于经验和直觉的问题求解方法&#xff0c;通过观察问题的特点&#xff0c;并根据某种指…...

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构&#xff0c;由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树&#xff0c;根朝上&#xff0c;分支向下。 根结点没有前驱结点&#xff0c;可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…...

微信小程序中 crypto-js 加解密全攻略

一、引言 在微信小程序开发中&#xff0c;数据的安全至关重要。加解密技术在保护用户数据和应用程序的安全性方面起着关键作用。小程序在与服务器进行数据交互时&#xff0c;面临着数据泄露、篡改等安全风险。为了确保用户信息的安全&#xff0c;选择合适的加解密算法变得尤为…...

单片机的软件开发环境

单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种将计算机系统中的中央处理器&#xff08;CPU&#xff09;、存储器&#xff08;Memory&#xff09;、输入输出接口&#xff08;I/O&#xff09;等集成在一块芯片上的微型计算机。单片机因其体积小、成本低、功能强…...

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom&#xff1a; dataZoom: [{type: inside, // inside 鼠标左右拖图表&#xff0c;滚轮缩放&#xff1b; slider 使用滑动条start: 0, // 左边的滑块位置&#xff0c;表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…...

Python 实现对人的行为预测

引言 随着人工智能技术的快速发展&#xff0c;行为预测在多个领域如智能安防、自动驾驶、个性化推荐系统等中扮演着越来越重要的角色。通过分析历史数据并结合先进的机器学习算法&#xff0c;我们可以预测个体或群体的行为模式&#xff0c;从而做出更加智能和高效的决策。本文…...

使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)

原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写&#xff0c;抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化&#xff0c;从而确保了枚举的单例特性。 …...

scala隐式转换

概念&#xff1a; 在Scala编程语言中&#xff0c;隐式转换是一种强大的功能&#xff0c;它允许程序在需要时自动转换数据类型或增强对象功能。这种转换通常是通过定义一个标记为implicit的函数来实现的&#xff0c;这个函数能够将一种类型转换为另一种类型。隐式转换的使用可以…...

Spring Boot 应用 “Connection is closed” 及 MySQL 空闲超时断开连接解决方案

在使用 Spring Boot MySQL HikariCP 的组合时&#xff0c;可能会在生产或测试环境中遭遇类似如下异常信息&#xff1a; org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT ...]; SQL state [nu…...

SLF4J框架原理及其实现方案

slf4j 是一个日志规范框架&#xff1b;基本上所有的 JAVA 日志都要实现这个规范&#xff1b;比如&#xff1a;Logback、log4j、log4j2&#xff1b;本文档记载如何实现 slf4j 规范&#xff1b;实现自己的日志框架&#xff1b; slf4j 分为两个部分&#xff0c;其中包含 &#xf…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...