前言

  • 在访问一个数组实例的元素时,可以使用 Array[index] 的形式。在访问一个字典实例的元素时,可以使用 Dictionary[index] 的形式。这种方括号的形式就是 “下标脚本”。

  • 下标脚本就是对一个东西通过索引,快速取值的一种语法,在 Swift 中,我们可以在类(Class)、结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法。

  • 下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值。

1、下标脚本的定义

  • 下标脚本定义需要关键字 subscript,与计算属性类似,下标脚本需要指定参数类型和返回值的类型。其一般格式为

    subscript(参数名1: 参数类型, 参数名2: 参数类型, ...) -> 返回类型 {
    
        get {
    // 返回类型声明中返回类型的值
    } set(newValue) {
    // 执行赋值操作
    }
    }
  • 参数

    • 参数也可以使用可变参数,但使用输入/输出(in-out)参数或和给参数设置默认值都是不允许的。
  • get 方法

    • 在下表脚本中可以定义 get 方法和 set 方法,其中 set 方法不是必须的。
    • 如果下标脚本中没有写 set 方法,则可以把 get 方法中的内容直接写到下标脚本的方法体中,从而省略外面的 get{}
  • set 方法

    • 在下表脚本中可以定义 get 方法和 set 方法,其中 set 方法不是必须的。
    • set 方法有一个默认的参数 newValue,用来表示传入的新值。
    • 即便不在参数列表中显示的写出 newValue,依旧可以在 set 方法中使用 newValue
    • 可以在参数列表中写上其它名字以替换默认的参数名 newValue
  • 外部形参

    • 和方法不同的是,无论你的下标脚本中有多少个参数,如果没有指定外部参数名,那么在调用的时候参数名称都是隐藏的,如果你觉得表义不够明确,则可以像方法那样加上外部参数名。

      subscript(外部形参名1 本地形参名1: 参数类型, 外部形参名2 本地形参名2: 参数类型, ...) -> 返回类型 {
      
          get {
      // 返回类型声明中返回类型的值
      } set(newValue) {
      // 执行赋值操作
      }
      }

2、下标脚本的使用

2.1 一般格式

  • 下标脚本的用法非常灵活,下标脚本的定义中,参数的数量、类型和返回值都可以是任意的。

  • 定义

    struct myString {
    
        var str: String = ""
    
        subscript(start: Int, length: Int) -> String {
    
            get {
    let startIndex = str.index(str.startIndex, offsetBy: start)
    let endIndex = str.index(str.startIndex, offsetBy: start + length) return String(str[startIndex...endIndex])
    } set {
    str = newValue
    }
    }
    }
  • 使用

    let str1 = myString(str: "hello world")
    print(str1[0, 11]) // hello world let str2 = str1[2, 5]
    print(str2) // llo w var str3 = myString()
    str3[0, 0] = "world"
    print(str3[0, 5]) // world

2.2 重载格式

  • 下标脚本支持重载,在调用时根据参数的不同而调用不同的下标脚本方法。

  • 定义

    class Student1 {
    
        var scores: [Int] = Array(repeating: 0, count: 5)
    
        subscript(index: Int) -> Int {
    
            get {
    return scores[index];
    }
    set {
    scores[index] = newValue
    }
    } subscript(indexs: Int...) -> [Int] { get {
    var values: [Int] = Array()
    for index in indexs {
    values.append(scores[index])
    }
    return values
    }
    set {
    var i = 0
    for index in indexs {
    scores[index] = newValue[i]
    i += 1
    }
    }
    }
    }
  • 使用

    let stu1 = Student1()
    stu1[0] = 1
    stu1[1] = 2 print("a[0]: \(stu1[0]), a[1]: \(stu1[1])") // a[0]: 1, a[1]: 2 let stu2 = Student1()
    stu2[1, 2, 3] = [5, 6, 7] print(stu2[0, 1, 2, 3, 4]) // [0, 5, 6, 7, 0]

Swift 下标脚本的更多相关文章

  1. Swift—下标脚本(Subscripts)

    下标脚本可以定义在类(Class).结构体(Struct).枚举(enumeration)这些目标中,可以认为是访问集合,列表或序列的快捷方式,使用下标脚本的索引设置和获取值,不需要再调用实例的特定的 ...

  2. Swift - 下标脚本方法介绍及实例

    定义下标脚本之后,可以使用“[]”来存取数据类型的值. 示例1:实现一个我们自定的字符串类,可以方便的通过索引获取某一个字符值,或某一部分字符串.同时也可以通过索引,给某一部分赋值. 1 2 3 4 ...

  3. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  4. iOS - Swift Subscript 下标脚本

    1.Subscript 下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值.语法类似于实例方法和计算型属性的混合.与定义实例方法类似,定义下标脚本使用 subscri ...

  5. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  6. Swift的属性,方法,下标脚本以及继承

    从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并非太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于非常好的应用Swift语言将会有比較大的帮助. 属性 存储属性 ...

  7. swift具体解释之八---------------下标脚本

    swift具体解释之八-----下标脚本 下标脚本 能够定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中.能够觉得是訪问对象.集合或序列的快捷方式.不须要 ...

  8. swift学习笔记之-下标脚本

    //下标脚本subscript import UIKit /*下标脚本(Subscripts) 下标脚本: 1.可以定义在类(Class).结构体(structure)和枚举(enumeration) ...

  9. 下标脚本(Swift)

    下标脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问集合(collection),列表(list)或序列(sequence的快捷 ...

随机推荐

  1. MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  2. jchat-windows-master 编译输出日志

    第一个项目成功生成的输出日志 >------ 已启动全部重新生成: 项目: QxOrm, 配置: Debug x64 ------ >Moc'ing IxModel.h... >Mo ...

  3. .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await

    本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...

  4. 最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复

    最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复 最新实战教程,Android自己主动化刷量.作弊与防作弊,案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android ...

  5. I/O Mutiplexing poll 和 epoll

    上一篇介绍了select的基本用法,接着来学习一下poll和epoll的基本用法.首先来看poll: #include <sys/poll.h> int poll (struct poll ...

  6. Spring ActiveMQ Caused By: javax.jms.IllegalStateException: Connection closed

    根据 http://www.cnblogs.com/yshyee/p/7448808.html 进行JMS操作时,发送跟监听放到不同的项目中进行时,出现以下异常信息: org.springframew ...

  7. Python调用Windows外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  8. stardict dict url

    http ://download.huzheng.org/zh_CN/  tar -xjvf a.tar.bz2 -C /usr/share/stardict/dic 

  9. 从JSF看XPages的优点

    我们都知道XPages基于JSF,或者可以说XPages是JSF标准的实现(implementation)之一.JSF从2004年的1.0到现在的2.0,已经经历了很大的变化和发展.XPages最初开 ...

  10. DLib Http Server程序示例

    /* 这个示例是一个使用了Dlib C++ 库的server组件的HTTP扩展 它创建一个始终以简单的HTML表单为响应的服务器. 要查看这个页面,你应该访问 http://localhost:500 ...