原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html#//apple_ref/doc/uid/TP40014097-CH16-ID305

1、下标(Subscript)

类、结构体和枚举都可以定义下标,这是一种访问集合类型、列表或者队列的成员元素的简写方式。你可以用下标来设置和取出对应的值,而不必单独设置写入和读取的方法。例如,访问Array实例用someArray[index],访问Dictionary实例用someDictionary[key]。

可以为同一个类型定义多种下标,选择哪一种下标形式则取决于你要传递给下标的索引值的类型。下标的维度不限定为一维,你可以根据自己的需要给下标设置多个输入参数。

2、下标语法

下标可以允许你在实例名字后面的[]中写上一个或多个值来对这个实例进行query。下标的语法与实例方法和计算属性的语法类似。和实例方法一样,下标有传入参数和返回类型。不同于实例方法的是,下标可以可读可写或者只读的。和计算属性一样,下标有get和set:

1 subscript(index: Int) -> Int {
2 get {
3 // return an appropriate subscript value here
4 }
5 set(newValue) {
6 // perform a suitable setting action here
7 }
8 }

newValue的类型和subscript的返回类型相同。和计算属性一样,如果你不指定新值的参数名,则默认使用newValue。

只读下标:

1 subscript(index: Int) -> Int {
2 // return an appropriate subscript value here
3 }

下面是一个只读下标的例子:

1 struct TimesTable {
2 let multiplier: Int
3 subscript(index: Int) -> Int {
4 return multiplier * index
5 }
6 }
7 let threeTimesTable = TimesTable(multiplier: 3)
8 print("six times three is \(threeTimesTable[6])")
9 // prints "six times three is 18"

3、下标的使用规则

subscript的实际意义取决于它所处的环境。通常,subscript用于方便访问集合、列表、队列的成员。你可以根据自己的需求来定义subscript的实现。

例如,Dictionary的下标:

1 var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
2 numberOfLegs["bird"] = 2

注意:Dictionary的下标返回的是Int?类型,因为并非每一个key都能对应一个value,如果输入的key不存在,则返回nil。

4、subscript的可选项

subscript可以接收任意数量的参数,这些参数可以是任何类型。

subscript也可以返回一种类型的值。

subscript可以接收变量参数和不定参数,但是不能接收in-out参数,也不能有参数默认值。

类和结构体可以定义多种subscript的实现,使用哪一种实现则取决于[]中传入的参数类型。多种subscript的实现,也称为subscript重载。

尽管最常见的是一个参数的subscript,你可以根据需要定义多个参数。

 1 struct Matrix {
2 let rows: Int, columns: Int
3 var grid: [Double]
4 init(rows: Int, columns: Int) {
5 self.rows = rows
6 self.columns = columns
7 grid = Array(count: rows * columns, repeatedValue: 0.0)
8 }
9 func indexIsValid(row: Int, column: Int) -> Bool {
10 return row >= 0 && row < rows && column >= 0 && column < columns
11 }
12 subscript(row: Int, column: Int) -> Double {
13 get {
14 assert(indexIsValid(row, column: column), "Index out of range")
15 return grid[(row * columns) + column]
16 }
17 set {
18 assert(indexIsValid(row, column: column), "Index out of range")
19 grid[(row * columns) + column] = newValue
20 }
21 }
22 }

上面是 一个矩阵的结构体。

用下标的方式来访问和修改数组的值。

在subscript的get和set中都用了断言来检查下标是否有效,其中,用了一个indexIsValid(row:column:)方法:

1 func indexIsValid(row: Int, column: Int) -> Bool {
2 return row >= 0 && row < rows && column >= 0 && column < columns
3 }

如果下标超出了矩阵的范围,就会产生一个assertion:

1 let someValue = matrix[2, 2]
2 // this triggers an assert, because [2, 2] is outside of the matrix bounds

Swift3.0P1 语法指南——下标的更多相关文章

  1. Swift3.0P1 语法指南——类和结构体

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  2. Swift3.0P1 语法指南——闭包

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  3. Swift3.0P1 语法指南——构造器

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  4. Swift3.0P1 语法指南——继承

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  5. Swift3.0P1 语法指南——方法

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  6. Swift3.0P1 语法指南——属性

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  7. Swift3.0P1 语法指南——枚举

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  8. Swift3.0P1 语法指南——函数

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  9. Swift3.0P1 语法指南——集合类型

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

随机推荐

  1. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  2. Matlab中使用脚本和xml文件自动生成bus模块

    帮一个老师写的小工具 在一个大工程中需要很多bus来组织信号,而为了规范接口,需要定义很多BusObject,用Matlab语言手写这些BusObject比较费工夫 所以用xml配置文件来写,也便于更 ...

  3. 搭建一套自己实用的.net架构(2)【日志模块-log4net】

    先谈谈简单的模块,日志.在系统中日志模块是必须的,什么系统日志,操作日志,调试日志.这里用的是log4net. 对log4net还不熟悉的小伙伴们赶快去搜索基础教程哦, 我这里就不温故了. 那么有人要 ...

  4. #1014 Trie树

    本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...

  5. HTML5的postMessage使用记要

    HTML5提出了一个新的用来跨域传值的方法,即postMessage(这个名字太通俗了所以你最好看看是不是自己写过一个同名的把它覆盖了).幸运的是IE8就开始支持了. 我们假设有两个网站,1.com与 ...

  6. 【原】浅谈KL散度(相对熵)在用户画像中的应用

    最近做用户画像,用到了KL散度,发现效果还是不错的,现跟大家分享一下,为了文章的易读性,不具体讲公式的计算,主要讲应用,不过公式也不复杂,具体可以看链接. 首先先介绍一下KL散度是啥.KL散度全称Ku ...

  7. php面向对象编程(二)

    现在我们来了解一下面向对象的一个封装性的问题 封装性:在我的理解里面 可以理解为一个u盘 我们使用u盘的接口与电脑进行数据之间的交互 但是我们不能看到里面的结构 这个特性我们可以称为封装性 好处:利用 ...

  8. hdu2586 LCA

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. UML类图详解

    下面是类图的实例: (注:飞翔接口那里应为空心三角形) UML中类图实例 接口:空心圆+直线(唐老鸭类实现了‘讲人话’):依赖:虚线+箭头(动物和空气的关系):关联:实线+箭头(企鹅需要知道气候才迁移 ...

  10. JAVA_jdk下载和环境变量的配置

    Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 基本组成: Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟 ...