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. 在windows的IDEA运行Presto

    After building Presto for the first time, you can load the project into your IDE and run the server. ...

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

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

  3. CodeForces 816B 前缀和

    To stay woke and attentive during classes, Karen needs some coffee! Karen, a coffee aficionado, want ...

  4. A - ACM Computer Factory(网络流)

    题目链接:https://cn.vjudge.net/contest/68128#problem/A 反思:注意拆点,否则的话节点就没用了,还有注意源点和汇点的赋值. AC代码: #include&l ...

  5. Go语言知识点笔记

    golang的花括号: 在go中,继承了C系的花括号作为一个作用域块的包含范围指示,但不同于C/C++中花括号位置可任意摆放,go要求“ { ”必须在右侧(一行代码尾部),不能单独另起一行.类似Pyt ...

  6. 2016.07.13-map的使用(以leetcode1-Two Sum为例)

    map的使用 1.unordered_map和map的区别 2.如何用 3.for (int a : nums1) 4.to_string() 5.map的应用 1.unordered_map和map ...

  7. 2017-2018-2 20179205《网络攻防技术与实践》Windows攻击实验

    Windows攻击实验 实验描述: 使用Metaspoit攻击MS08-067,提交正确得到远程shell过程的截图(不少于五张). MS08-067漏洞介绍   MS08-067漏洞的全称为&quo ...

  8. java 面试算法题

    /** * 设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从 * 出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为 * 止.设n个人的编号分别为1,2,… ...

  9. python进阶之函数和类内建魔法属性

    前言 关于对象的魔法方法我们已经讲得太多,但是对于类或函数内建的魔法属性和功能我们涉及较少,下面系统了解一下类和函数的内建属性. 查看内建属性 class Person(object): pass d ...

  10. 006_Mac下sublime text 的“package control”安装,sublimepackage

    Mac下sublime text 的“package control”安装,sublimepackage 小伙伴们好,我根据昨晚的经历写一个小总结:关于“Mac下sublime text 的“pack ...