swift 笔记 (十二) —— 下标

下标

swift允许我们为 类,结构体,枚举 定义下标,以更便捷的方式访问一大堆属性。比如Array和Dictionary都是结构体,swift的工程师已经为这两个类型提供好了下标操作的代码,所以,我们才可以通过 myArray[2]这种方式,读取和改写这个struct中保存的数据。而且,一个类型中可以定义多种下标访问方式(重载,关于重载,在后面的笔记中会提到,这里先不用太在意)

下标可以定义为“读写”型的,也可以定义为”只读”型,这种行为,是通过定义一组操作完成的,这与之前笔记中提到过的用于计算的属性的setter和getter是一样的:

下标定义形式:

“读写”型:

subscript(index: Int) -> Int {

get {

}

set(newValue) {

}

}

“只读”型:

subscript(index: Int) -> Int {

//前面的笔记中有提到,因为只有一个get方法,是可以省掉get{ 与 }的。

}

官方的例子:

定义了一个叫 TimesTable的结构体,它有一个“只读”型下标的定义,通过下标语法,可以取得到multiplier那么多倍的index值。。。因为那是 multiplier * index嘛。。。。

所以,最后一个println的结果是18.(multiplier的值被初始化为3, 3*6 = 18)

下标可以使用任何类型做为输入参数,也就是说,我们可以把class, struct, enum, Int, Double, String 等等,当做下标的参数使用,但是这个参数不能是in-out类型的,也不能有默认值。

前面的笔记中没有提到过任何关于“多维数组”的词,也没有相关的例子,因为我也不知道怎么弄,囧。

但是有了自定义下标的话,就不一样了,事情就变得简单了,一切由我们自己说了算,不管是二维,三维,四维,任何维度上保存什么类型等等,一切都由我们自己说了算, 拿二维数组来举例(其实是官方的例子):

定义了一个矩阵类型 Matrix, 通过var grid: Double[] 的使用可以看到, 第7行,定义了一个一维的Array来保存所有的数据。 第12行开始定义了下标的访问行为, 可以get, 也可以set, 所以这个下标是个“读写”型的。

根据下标的参数 row和 column可以计算出我们要访问的元素的在Array中的位置,通过Array的下标可以直接读取或者写入我们的数据。

var myMatrix = Matrix(row: 2, columns: 2)

myMatrix[0, 0] = 8

println(myMatrix[0, 0])   //得到8

至此,我们就可以开始快乐的使用二维数组了~~~多维的也一样

swift 笔记 (十二) —— 下标

时间: 2024-10-04 02:51:11

swift 笔记 (十二) —— 下标的相关文章

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

swift 笔记 (十六) —— 可选链

可选链(Optional Chaining) 我们都知道"可选型"是什么,那么可选链又是什么,举个例子解释一下: struct MyName{ var name } struct MyInfo { var myName:MyName? = MyName() } class MyClass { var structInstance: MyInfo? = MyInfo() } 这里有两个结构体和一个类,当,这个类实例化的时候: var myInstance = MyClass() 所有的可

swift 笔记 (十四) —— 构造过程

构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们通常会定义一个方法来完成,这个方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作以及一此自定义化的处理. 为存储型属性设置初始值 类和结构体在生成实例那一刻,必须为所有的属性赋以特定的初始值. 要么在定义存储型属性的时候直接给个初始值,否则就必须在构造器里面指定一个初始值. 上面说的这两种情况,都不会触发存储型属性的监听者行为(property observer). struc

虚拟机VMWare学习笔记十二 - 将物理机抓取成虚拟机

1. 安装VMware vCenter Converter Standalone Client 运行虚拟机,File -- Virtualize a Physical Machine 这时如果电脑中没有VMware vCenter Converter Standalone Client ,则会进行安装. 安装过程 之后图标会出现在桌面上,双击运行 选择连接到本地服务器,登陆 点击转换计算机 这个,可以将本地计算机抓取成虚拟机,也可以将其他可以访问的计算机(需知道管理员用户名及密码)抓取成虚拟机.

swift 笔记 (十九) —— 协议

协议(Protocols) 协议仅是用定义某些任务或者是功能必须的方法和属性.类似于java里的interface的作用.但协议并不会实现具体的功能. 我猜这个名字源于OO中提到的"契约",但我并不觉得这名字很好,反而是interface这名字更容被接受,因为我觉得协议这个名字很容易和网络编程的时候的网络协议搞混,网络协议也通常简称为协议. 语法: protocol MyProtocol { //协议定义 } struct MyStruct: MyProtocol1, MyProtoc

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

laravel3学习笔记(十二)

原作者博客:ieqi.net ==================================================================================================== 请求反射 HTTP 协议本身是无状态性的,但是在应用中处理各种业务逻辑时我们必须要有状态的把控,这样,折中的办法就是将状态进行标记然后嵌入到 HTTP 协议的请求中,然后应用根据这些标记来进行状态的串联以及处理.所以我们就要对请求进行反射处理以获取请求信息, Lara

java jvm学习笔记十二(访问控制器的栈校验机制)

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们会简单的描述一下jvm访问控制器的栈校验机制. 这节课,我们还是以实践为主,什么是栈校验机制,讲一百遍不如你自己实际的代码一下然后验证一下,下面我们下把环境搭起来. 第一步,配置系统环境.(copy吧,少年) path=%JAVA_HOME%/bin JAVA_HOME=C:/Java/jdk1.6

寒假阅读笔记十二

架构之美--最终用户应用架构(二) 今天,我阅读的是<架构之美>的第十二章,这一章主要讲的是Akonadi框架,让我充分了解了Akonadi框架是什么?怎么用? kde 4.1中的Akonadi是一个以mysql为存储管理的 KDE 4 存储接口.它分为两个部分,一个称之为 Akonadi服务器,一个是为用户程序提供的和Akonadi服务器打交道的库,Akonadi服务器是单独提供的程序,属于kde的支持部分的一个软件.用户库包含在kdepimlibs之中.Akonadi目前的主要应用是做为k