Swift2.0语言教程之下标脚本

下标脚本

下标脚本是访问对象、集合或者序列的快速方式。开发者不需要调用实例特定的赋值和访问方法,就可以直接访问所需要的数值。例如在数组中,可以直接使用下标去访问或者修改数组中的某一个元素。代码如下:

  • import Foundation
  • var array=["One","Two","Three","Four","Five"]
  • print("访问元素:\(array[2])")
  • array[2]="Third"
  • print("访问修改后的元素:\(array[2])")

运行结果如下:

  • 访问元素:Three
  • 访问修改后的元素:Third

在Swift中,下标脚本也可以定义在类中。这样,开发者就可以像数组一样,快速访问类中的属性。本节将主要讲解类中如何使用下标脚本。

定义下标脚本

下标脚本通过subscript关键字进行定义,其定义形式如下:

  • subscript(参数名称1:数据类型,参数名称2:数据类型,…) ->返回值的数据类型 {
  • get {
  • // 返回与参数类型匹配的类型的值
  • }
  • set(参数名称) {
  • // 执行赋值操作
  • }
  • }

注意:set参数名称必须和下标脚本定义的返回值类型相同,所以不为它指定数据类型。与计算属性相同,set后面如果没有声明参数,那么就使用默认的newValue。

【示例8-18】以下将在类中定义一个下标脚本,实现通过下标脚本获取某一属性的值。代码如下:

  • class NewClass{
  • var english:Int=0
  • var chinese:Int=0
  • var math:Int=0
  • //定义下标脚本
  •  subscript(index:Int)->Int{
  •         get{
  •             switch index{
  •                 case 0:
  •                     return english
  •                 case 1:
  •                     return chinese
  •                 case 2:
  •                     return math
  •                 default:
  •                     return 0
  •             }
  •         }
  •         set{
  •           english=newValue
  •             chinese=newValue
  •            math=newValue
  •         }
  •     }
  • }

调用下标脚本

定义下标脚本后,就可以进行调用了,其调用形式如下:

  • 实例对象[参数1,参数2,…]

其中,[]和它里面的内容就代表了在类中定义的下标脚本。

使用下标脚本

下标脚本可以根据传入参数的不同,分为具有一个入参参数的下标脚本和具有多个入参参数的下标脚本。以下就是对这两个下标脚本在类中的使用。

1.具有一个传入参数的下标脚本

具有一个入参参数的下标脚本是最常见的。在集合以及字符串中使用的下标就是具有一个传入参数的下标脚本。

【示例8-19】以下程序通过使用下标脚本计算3门成绩的和。代码如下:

  • import Foundation
  • class Score{
  • var english:Int=0
  • var chinese:Int=0
  • var math:Int=0
  • //定义下标脚本
  •  subscript(index:Int)->Int{
  •         get{
  •             switch index{
  •                 case 0:
  •                     return english
  •                 case 1:
  •                     return chinese
  •                 case 2:
  •                     return math
  •                 default:
  •                     return 0
  •             }
  •         }
  •         set{
  •           english=newValue
  •             chinese=newValue
  •            math=newValue
  •         }
  •     }
  • }
  • var myscore=Score()
  • var sum:Int=0
  • var i:Int=0
  • //遍历
  • for i=0;i<3;++i{
  • sum+=myscore[i]
  • }
  • print(sum)
  • //修改属性值
  • myscore[0]=100
  • myscore[1]=90
  • myscore[2]=80
  • //遍历求和
  • for i=0;i<3;++i{
  •     sum+=myscore[i]
  • }
  • print(sum)

运行结果如下所示:

  • 0
  • 240                                       

注意:下标脚本可以和计算属性一样设置为读写或只读。以上的代码是读写的形式。只读的一般语法形式如下:

  • subscript(参数名称:数据类型) -> Int {
  • get{
  • //返回与参数匹配的Int类型的值
  • }
  • }
  • 可以简写为以下的形式:
  • subscript(参数名称:数据类型) -> Int {
  • // 返回与参数匹配的Int类型的值
  • }

【示例8-20】以下就使用只读的形式实现使用下标访问属性值的功能。代码如下:

  • import Foundation
  • class Score{
  • var english:Int=50
  • var chinese:Int=100
  • var math:Int=30
  • //定义下标脚本
  •  subscript(index:Int)->Int{
  •             switch index{
  •                 case 0:
  •                     return english
  •                 case 1:
  •                     return chinese
  •                 case 2:
  •                     return math
  •                 default:
  •                     return 0
  •             }
  •     }
  • }
  • var myscore=Score()
  • var sum:Int=0
  • var i:Int=0
  • //遍历输出属性值
  • for i=0;i<3;++i{
  •    print(myscore[i])
  • }

运行结果如下所示:

  • 50
  • 100
  • 30

2.具有多个参数的下标脚本

具有一个入参参数的下标脚本一般使用在多维维数组中。以下就是使用具有两个参数的下标为二维数组赋值。代码如下:

  • import Foundation
  • var value:Int=0
  • class NewClass{
  • var rows: Int = 0, columns: Int=0
  • 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
  •         }
  •     }
  • }
  • var matrix = NewClass(rows: 2, columns: 2)
  • print("没有赋值前")
  • print(matrix[0,0])
  • print(matrix[0,1])
  • print(matrix[1,0])
  • print(matrix[1,1])
  • print("赋值后")
  • matrix[0,0]=1.0
  • matrix[0,1]=5.6
  • matrix[1,0]=2.4
  • matrix[1,1]=3.2
  • print(matrix[0,0])
  • print(matrix[0,1])
  • print(matrix[1,0])
  • print(matrix[1,1])

运行结果如下所示:

  • 没有赋值前
  • 0.0
  • 0.0
  • 0.0
  • 0.0

赋值后

  • 1.0
  • 5.6
  • 2.4
  • 3.2

当然,下标脚本除了可以对访问对象以及对象中的属性外,还可以实现一些自定义的功能,如以下的代码,此代码实现的功能是计算下标值和10的乘积。代码如下:

  • import Foundation
  • class NewClass{
  • var count1: Int=10
  • //定义下标脚本
  •   subscript(index:Int) -> Int {
  •         get {
  •                           var count=index*count1
  •                          return count
  •         }
  •         set(newvalue){
  •               //执行赋值操作
  •                      count1=newvalue
  •         }
  •     }
  • }
  • let newClass=NewClass()
  • print(newClass.count1)
  • print(newClass[6])

运行结果如下:

  • 10
  • 60

本文选自:Swift2.0语言快速入门v3.0 大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

Swift2.0语言教程之下标脚本的更多相关文章

  1. Swift2.0语言教程之类的嵌套与可选链接

    Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...

  2. Swift2.0语言教程之类的属性

    Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...

  3. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...

  4. Swift2.0语言教程之类的方法

    Swift2.0语言教程之类的方法 Swift2.0语言的方法 方法其实就是函数,只不过它被定义在了类中.在Swift中,根据被使用的方式不同,方法分为了实例方法和类型方法两种.这两种方法的定义也和O ...

  5. Swift2.0语言教程之闭包

    Swift2.0语言教程之闭包 Swift2.0语言闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语 ...

  6. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  7. Swift3.0语言教程组合字符串

    Swift3.0语言教程组合字符串 Swift3.0语言教程组合字符串,当开发者想要将已经存在的字符串进行组合,形成一个新的字符串,可以使用NSString中的两个方法,分别为appending(_: ...

  8. Swift3.0语言教程获取字符

    Swift3.0语言教程获取字符 Swift3.0语言教程获取字符,在字符串中获取某一下标位置(下标索引)处的字符是很常见的功能,在NSString中使用character(at:)方法实现,其语法形 ...

  9. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...

随机推荐

  1. 实验九 Web安全基础

  2. 2016-2017-2 《Java程序设计》第五周学习总结

    20155223 2006-2007-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 try.catch语法:若程序发生错误,执行流程就调离错误点,然后比较catch括号 ...

  3. Spark1.3.1 On Yarn的集群搭建

    下面给出的是spark集群搭建的环境: 操作系统:最小安装的CentOS 7(下载地址) Yarn对应的hadoop版本号:Hadoop的Cloudera公司发行版Hadoop2.6.0-CDH5.4 ...

  4. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...

  5. 图片压缩之 PNG

    作者:程志达链接:https://zhuanlan.zhihu.com/p/19570424来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. PNG(Portable N ...

  6. 为什么使用do{}while(0)来进行宏定义

    最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因:   1,空的宏定义避 ...

  7. 企业日志大数据分析系统ELK+KAFKA实现【转】

    背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项:所以最近将Redis ...

  8. python几种装饰器的用法

    用函数装饰函数 这种比较常见首先定义装饰器函数 def cache(func): data = {} @wraps(func) def wrapper(*args, **kwargs): key = ...

  9. Intel大坑之一:丢失的SSE2 128bit/64bit 位移指令,马航MH370??

    缘由 最近在写一些字符串函数的优化,兴趣使然,可是写的过程中,想要实现 128bit 的按 bit 逻辑位移,遇到了一个大坑,且听我娓娓道来. 如果要追究标题,更确切的是丢失的SSE2 128 bit ...

  10. 13 JSON-RPC: a tale of interfaces

    JSON-RPC: a tale of interfaces 27 April 2010 Here we present an example where Go's interfaces made i ...