#Swift 下标 Subscript - Access the elements of a collection

news2024/10/19 17:10:14

在 Swift 中,下标(Subscript)是一种简洁的语法,用于访问集合(如数组、字典)等数据结构的元素。下标的具体含义取决于它的使用上下文,通常用于简化访问集合成员的操作。你可以根据自定义类或结构体的需求,自由实现下标操作,提供灵活的访问方式。


下标的基本语法

下标的定义使用 subscript 关键字,可以定义一个或多个参数,并且支持只读或读写操作。下标的语法类似于函数,但不使用 func 关键字。

subscript(index: Int) -> ElementType {
    get {
        // 返回与 index 相关联的值
    }
    set(newValue) {
        // 设置新值
    }
}
  • 参数:下标可以有多个参数,参数类型不受限制,可以是整型、字符、甚至其他自定义类型。
  • 返回值类型:定义下标时需要指定返回值类型,可以是任何类型。
  • get 和 set:可以为下标提供 getset 代码块。如果只定义 get,则该下标为只读;如果定义了 set,则为读写下标。

只读下标示例

一个只读下标通过 get 代码块返回值,但不支持修改。

struct TimesTable {
    let multiplier: Int

    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

let threeTimesTable = TimesTable(multiplier: 3)
print(threeTimesTable[6]) // 输出: 18

在这个例子中,TimesTable 结构体包含一个只读下标,通过 multiplierindex 相乘来返回乘法表的结果。threeTimesTable[6] 使用了自定义下标,返回结果为 18

读写下标示例

一个读写下标定义了 getset 代码块,允许我们读取和修改值。

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

var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
print(matrix[0, 1]) // 输出: 1.5
print(matrix[1, 0]) // 输出: 3.2

在这个例子中,Matrix 结构体使用一个带有两个参数(行和列)的下标来访问矩阵的元素。下标是读写的,因此可以用于获取和设置矩阵中的值。

下标的应用场景

  1. 自定义集合类型:对于集合类型,可以使用下标来简化访问和操作元素的方式。
  2. 字典和数组替代:下标可以用于在自定义类型中实现类似字典或数组的功能。
  3. 封装复杂的访问逻辑:当需要更灵活的索引访问或计算逻辑时,下标可以帮助封装复杂的访问或计算逻辑。

Swift 中下标的基本用法

Swift 内建的数据类型(如数组和字典)都实现了下标,用于读取或修改它们的元素。例如,Swift 的 Dictionary 类型使用下标来设置和获取字典中存储的键值对。

字典下标示例
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

在这段代码中:

  • numberOfLegs 是一个字典,包含了三组键值对,其中键是字符串类型,值是整数类型。字典的类型为 [String: Int],这是由 Swift 自动推断出来的。
  • 通过下标 numberOfLegs["bird"] = 2,我们为字典添加了一个新的键值对:键为 "bird",值为 2
获取和修改字典元素

字典类型的下标返回的是一个可选类型optional),因为并非所有的键都一定有对应的值。例如:

let legs = numberOfLegs["ant"]    // legs 的类型是 Int?,结果为 Optional(6)
let unknown = numberOfLegs["dog"] // unknown 的类型是 Int?,结果为 nil
  • 当访问存在的键(如 "ant")时,返回值为 Int?,并且包含了实际的值(Optional(6))。
  • 当访问不存在的键(如 "dog")时,返回值为 nil,表示这个键在字典中没有对应的值。
使用 nil 删除键值对

由于字典的下标返回的是可选类型,你可以通过将某个键的值设为 nil 来删除这个键值对:

numberOfLegs["ant"] = nil // 删除键 "ant" 对应的键值对
print(numberOfLegs)       // 输出: ["spider": 8, "cat": 4, "bird": 2]

将键 "ant" 对应的值设置为 nil,即表示从字典中删除了 "ant" 这个键。


下标的高级用法

1. 多参数下标

下标可以接收多个参数,使得它可以支持更多维度或更灵活的参数化访问。

struct ThreeDimensionalMatrix {
    var values: [[[Int]]] = [[[0]]]

    subscript(x: Int, y: Int, z: Int) -> Int {
        get {
            return values[x][y][z]
        }
        set {
            values[x][y][z] = newValue
        }
    }
}

在这个例子中,下标使用三个参数,适合于三维矩阵等多维数据结构的访问。

2. 下标的重载

可以在一个类型中定义多个下标,只要它们的参数类型或数量不同。重载下标使得类型可以提供多种访问方式。

struct Library {
    var books = ["Swift Programming", "Advanced iOS", "Data Structures"]

    subscript(index: Int) -> String {
        return books[index]
    }

    subscript(title: String) -> Int? {
        return books.firstIndex(of: title)
    }
}

let library = Library()
print(library[0])          // 输出: Swift Programming
print(library["Data Structures"] ?? "Not found") // 输出: 2

在这个例子中,Library 类型定义了两个下标:一个通过索引获取书籍名称,另一个通过书籍名称获取索引。

3. 使用类型下标

static 下标允许直接在类型上使用下标,通常用在特定场景,如工厂方法或静态访问。

enum Planet: Int {
    case mercury = 1, venus, earth, mars
    
    static subscript(n: Int) -> Planet? {
        return Planet(rawValue: n)
    }
}

let planet = Planet[3]
print(planet ?? "Unknown planet") // 输出: earth

在这个例子中,Planet 枚举使用了类型下标,可以通过整数直接访问对应的枚举值。

总结

  • 下标(Subscript) 提供了一种简洁的语法来访问和修改类型的元素,尤其适用于集合类型。
  • 自定义下标 允许开发者为自己的类型添加访问逻辑和行为,可以是只读或读写的。
  • 下标支持 多参数重载、以及 类型下标,使得它们非常灵活,可以在许多场景下替代字典或数组的索引访问。

Swift 的下标机制提供了简洁且强大的语法,可以根据需求灵活定义访问逻辑,提升代码的可读性和结构性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识MySQL · 数据库

目录 前言&#xff1a; 数据库 简单使用 存储引擎 前言&#xff1a; 本文也是MySQL的第一篇文章了&#xff0c;新的知识点已经出现&#xff0c;怎么能够停止不前&#xff0c;穿越时空……(迪迦奥特曼乱入哈哈哈)。 言归正传&#xff0c;我们在本文的目标有&#xff1a; …

工厂生成中关于WiFi的一些问题

一 背景: 主要做高通和MTK,工厂生成中通过使用adb wifi,因为这样生产效率高并且避免了新机器有划痕,但是也经常碰到adb wifi无法连接的问题,那么是什么原因导致呢? 二 案例 测试步骤: 使用adb wifi连接手机测试工厂case adb usb adb tcpip 5555 adb connect DU…

高效监控系统:Nightingale本地化部署与远程访问指南

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 本文主要介绍如何在本地Linux系统部署 Nightingale 夜莺监控并结合cpolar内网穿透工具实现远程…

Android组件化、模块化、Catalogs

前言 下载代码-----》码云下载 下载代码-----》github下载 本篇是Android最新的依赖架构设计&#xff0c;gradle版本要8.0以上&#xff0c;代码实现基于8.5.1。好多年开发过程中&#xff0c;我们碰到config.gradle&#xff0c;buildSrc&#xff0c;composing builds等依赖编译…

新款任天堂switch游戏机方案,支持4K60HZ投屏方案,显示器,手柄方案

据传任天堂将推出新的一代的switch掌机&#xff0c;而新款掌机将支持4K60HZ投屏 都2402年了再做1080P确实有点不太象话了 4K60HZ相较于1080P能够提升很多游戏体验&#xff0c;这时不管是HDMI显示器或者是VR眼睛清晰度都会让人舒服很多。 不过新一代的任天堂似乎也在PD协议上…

用作曲的手法写旋律 什么是动机 ​动机扩大 单音重复 移八度

【你怎么还不会写旋律&#xff01;&#xff01;&#xff01;猴子都听的懂的旋律教程来了&#xff01;两分钟让你快速上手&#xff01;】 你怎么还不会写旋律&#xff01;&#xff01;&#xff01;猴子都听的懂的旋律教程来了&#xff01;两分钟让你快速上手&#xff01;_哔哩哔…

同济子豪兄--图的基本表示【斯坦福CS224W图机器学习】

无向图&#xff08;Undirected Graph&#xff09;&#xff1a; 在无向图中&#xff0c;边没有方向&#xff0c;即如果顶点A和顶点B之间有一条边&#xff0c;那么这条边既表示A到B的关系&#xff0c;也表示B到A的关系。换句话说&#xff0c;边是双向的。无向图的边通常用一条线段…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统&#xff0c;是一个支持前后端分离设计的 客户端(C/S)项目&#xff0c;该示例项目前端xaml使用UI库 &#xff0c;Material Design Themes UI 来构建用户界面&#xff0c;确保…

Ubuntu如何显示pcl版本

终端输入&#xff1a; apt-cache show libpcl-dev可以看到&#xff0c;Ubuntu20.04&#xff0c;下载的pcl&#xff0c;应该都是1.10版本的

一次性入门三款分布式定时任务调度框架:Quartz、ElasticJob3.0、xxl-job

分布式定时任务调度框架&#xff08;文末有源码&#xff09; 前言1、Quartz1.1 数据库1.2 maven依赖1.3 代码实现1.3.1 创建一个job1.3.1 为job设置trigger 1.4 配置文件1.5 启动、测试1.1 单机1.2 集群 2、ElasticJob2.1 下载zk2.2 新建三个类型的作业2.3 配置文件2.4 启动项目…

Windows下配置Nginx和PHP

之前在Windows开发php项目用的是phpstudy&#xff0c;好用的很。但是phpstudy好久没有更新了&#xff0c;感觉PHP像没有人再用了一样。但是PHP拿来开发小系统&#xff0c;还是很高效的&#xff0c;今天记录如何在Windows环境下配置Nginx和PHP。 1. 配置nginx Nginx软件下载解压…

基于Springboot+Vue的宠物管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

实现双向链表的增删改查

头文件 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; } LTNode; //v…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

ParallelsDesktop20最新版本虚拟机 一键切换系统 游戏娱乐两不误

让工作生活更高效&#xff1a;Parallels Desktop 20最新版本虚拟机的神奇之处 大家好&#xff01;&#x1f44b; 今天我要跟大家安利一款让我工作效率飞升的神器——Parallels Desktop 20最新版本虚拟机。作为一个日常需要在不同操作系统间来回穿梭的人&#xff0c;这款软件简直…

react18中的计算属性及useMemo的性能优化技巧

react18里面的计算属性和使用useMemo来提升组件性能的方法 计算属性 实现效果 代码实现 函数式组件极简洁的实现&#xff0c;就这样 import { useState } from "react"; function FullName() {const [firstName, setFirstName] useState("");const [la…

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口&#xff0c;并允许用户使用鼠标来选择多个 ROI。控制方式&#xff1a;使用空格键或…

明日周刊-第23期

十月已过半&#xff0c;气温也转凉了&#xff0c;大家注意保温哦。冬吃萝卜&#xff0c;夏吃姜&#xff0c;在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片&#xff0c;现在抓娃娃单次普遍都控制在1块钱以下了&#xff0c;还记得多年前的抓…

智能手表PPG技术原理:【图文讲解】

光体积变化描记图法&#xff08;Photoplethysmography&#xff0c;简称PPG&#xff09;是借光电手段在活体组织中监测血液容积变化的一种无创监测方法 目前智能手表比较标配的功能&#xff1a;血糖、血压、心电、心率、血氧 1&#xff1a;人体血管 先温习一下&#xff0c;人…