[翻译]Swift编程语言——下标

下标

类、结构体和枚举可以使用下标,用来方便访问一个集合、列表或序列的成员。可以使用下标根据索引设置和获取值,而不需要单独的方法。举例来说,你可以使用someArray[index]来访问一个数组的实例中的元素,也可以使用someDictionary[key]来访问一个字典中的元素。

可以定义单一类型的多个脚本,根据你传递给脚本的索引值的类型会自动选择合适的重载脚本。脚本并不限制只能有一维,可以多个参数,以适应定制的需要。

下标语法

下标可以做到:实例名称之后的方括号中写一个或多个值来查询类型实例。它的语法类型实例方法语法和计算属性语法。使用subscript关键字定义下标,然后指定一个或多余一个的参数和返回类型,就像实例方法一样。不同于实例方法,下标可以是可读写的也可以是只读的。就像计算属性一样,这种限制是通过getter和setter实现的:

subscript​(​index​: ​Int​) -> ​Int​ {
​ ​get​ {
​ ​// return an appropriate subscript value here
​ }
​ ​set​(​newValue​) {
​ ​// perform a suitable setting action here
​ }
​}

newValue 的类型和下标返回值的类型相同。和计算属性一样,你可以选择不指定setter的参数((newValue))。没有指定参数的时候默认参数newValue生效。

和只读计算属性一样,可以把只读脚本中的get关键字丢掉:

subscript​(​index​: ​Int​) -> ​Int​ {
​ ​// return an appropriate subscript value here
​}

这里有一个只读下标的示例,它定义了一个叫做TimesTable的结构体表示一个整数的n倍数表:

truct​ ​TimesTable​ {
​ ​let​ ​multiplier​: ​Int
​ ​subscript​(​index​: ​Int​) -> ​Int​ {
​ ​return​ ​multiplier​ * ​index
​ }
​}
​let​ ​threeTimesTable​ = ​TimesTable​(​multiplier​: ​3​)
​println​(​"six times three is ​\(​threeTimesTable​[​6​])​"​)
​// prints "six times three is 18"

这个例子中,一个新的TimesTable实例被创建,用来表现一个整数的三倍数表。具体的,是通过传递一个3给结构体的初始化方法,初始化multiplier为3.

可以通过下标查询threeTimesTable实例,就像上面的threeTimesTable[6]。这个语句请求了three-times-table中的第六个元素,返回了18,也就是6的3倍。

NOTE

一个n倍数表依据的是数学规则。不会给threeTimesTable[someIndex]赋予一个新值,所以TimesTable的这个下标是一个只读下标。

下标用法

下标准确意义要依赖其使用的上下文。下标的典型用法是简洁的访问集合、列表或者序列的成员。也可以为了类或者结构体的特殊功能,用适当的方式实现下标。

举例来说,Swift的字典类型实现了一个下标来实现对字典类型实例中的值的读取和赋值。你可以在方括号中提供一个字典键值来设置一个字典内容,也可以将字典值赋给下标:

​var​ ​numberOfLegs​ = [​"spider"​: ​8​, ​"ant"​: ​6​, ​"cat"​: ​4​]
​numberOfLegs​[​"bird"​] = ​2

上面定义了一个变量叫做numberOfLegs,然后使用了包含三个键值对的字典的字面语句对其初始化。字典numberOfLegs是一个[String:Int]类型的。创建完这个字典后,例子采用下标分配并添加了一个键为“bird”,值为整型2的内容。

更多的关于字典下标的内容,参见 Accessing and Modifying a Dictionary。

NOTE

Swift的字典类型实现了它的key-vlaue下标,通过下标得到一个可选类型。比如上面的numberOfLegs字典,它的下标返回一个类型是Int?(或者可选int)的值。字典类型使用可选类型下标来模仿不是所有的键都会有一个对应的值,提供了一种处理可能对应的键为nil的途径。

Subscript Options

下标可以使用人一个数量的参数,而且这些参数可以是任意类型的。下标可以返回任意类型。下标可以使用变量参数,也可以使用可变参数,但是不能使用in-out参数或者提供参数默认值。

一个类好哦这结构体可以有多个下标实现,只要有必要,会根据在方括号中的值类型选择合适的下标实现。这种多下标的情况叫做下标重载(subscript overloading)。

尽管多数下标采用单一参数,但是你也可以定义多个参数的。下面的例子定义了一个矩阵结构体,表示了一个二维Double矩阵。它的下标就采用了两个整型做参数:

struct​ ​Matrix​ {
​ ​let​ ​rows​: ​Int​, ​columns​: ​Int
​ ​var​ ​grid​: [​Double​]
​ ​init​(​rows​: ​Int​, ​columns​: ​Int​) {
​ ​self​.​rows​ = ​rows
​ ​self​.​columns​ = ​columns
​ ​grid​ = ​Array​(​count​: ​rows​ * ​columns​, ​repeatedValue​: ​0.0​)
​ }
​ ​func​ ​indexIsValidForRow​(​row​: ​Int​, ​column​: ​Int​) -> ​Bool​ {
​ ​return​ ​row​ >= ​0​ && ​row​ < ​rows​ && ​column​ >= ​0​ && ​column​ < ​columns
​ }
​ ​subscript​(​row​: ​Int​, ​column​: ​Int​) -> ​Double​ {
​ ​get​ {
​ ​assert​(​indexIsValidForRow​(​row​, ​column​: ​column​), ​"Index out of range"​)
​ ​return​ ​grid​[(​row​ * ​columns​) + ​column​]
​ }
​ ​set​ {
​ ​assert​(​indexIsValidForRow​(​row​, ​column​: ​column​), ​"Index out of range"​)
​ ​grid​[(​row​ * ​columns​) + ​column​] = ​newValue
​ }
​ }
​}

Matrix提供了带两个参数(rows 和columns)的构造方法,创建了一个足够容纳rows*columns个值的Double数组。其中的每个位置都被给另一个初始值0.0.为了达到这个目的,数组的大小和每个位置的初始值被作为初始化参数传递进来。关于初始化方法的更多信息,参见Creating and Initializing an Array。
可以根据行列的数目来创建一个新的Matrix实例:
​var​ ​matrix​ = ​Matrix​(​rows​: ​2​, ​columns​: ​2​)

上面的例子创建了一个Matrix实例,它有两行两列。Matrix实例的grid数组是一个平的矩阵,读取它要从左上到右下:
此处输入图片的描述

传递行和列的值(用逗号分割他们)给下标,可以对矩阵中的值进行设置:

​matrix​[​0​, ​1​] = ​1.5
​matrix​[​1​, ​0​] = ​3.2

这两句调用了下标的setter给矩阵右上角的位置(row 是0,column是1)设置了值1.5,给左下角的位置(row是1,column是0)设置了值3.2:

此处输入图片的描述

Matrix下标的getter和setter都含有一个检查下标的row 和column是否合法的断言。为了支持这个断言,Matrix提供了一个方便调用的方法叫做indexIsValidForRow(_:column:),这个方法检查了请求的row和column是否在矩阵的范围内:

​func​ ​indexIsValidForRow​(​row​: ​Int​, ​column​: ​Int​) -> ​Bool​ {
​    ​return​ ​row​ >= ​0​ && ​row​ < ​rows​ && ​column​ >= ​0​ && ​column​ < ​columns
​}

如果尝试访问超过矩阵范围的下标,断言就被触发:

​let​ ​someValue​ = ​matrix​[​2​, ​2​]
​// this triggers an assert, because [2, 2] is outside of the matrix bounds
基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值