类,结构和枚举类型都可以通过定义下标来访问一组或者一个序列中的成员元素。通过下标索引就可以方便地检索和设置相应的值,而不需要其他的额外操 作。比如你可以通过someArray[index]来访问数组中的元素,或者someDictionary[key]来对字典进行索引。
你可以为一个类型定义多个下标,以及适当的下标重载用来根据传递给下标的索引来设置相应的值。下标不仅可以定义为一维的,还可以根据需要定义为多维的,多个参数的。
1、下标语法
下标可以让你通过实例名后加中括号内一个或多个数值的形式检索一个元素。语法和方法语法和属性语法类似,通过使用subscript关键定义,一个 或多个输入参数以及一个返回值。不同于实例方法的是,下标可以是可读写的或者只读的。这种行为通过一个getter和setter语句联通,就像是计算属 性一样。
subscript(index: Int) -> Int { get { // return an appropriate subscript value here } set(newValue) { // perform a suitable setting action here } }
newValue的类型和下标返回的类型一样。和计算属性一样,你可以选择不指定setter的参数,因为当你不指定的时候,默认参数newValue会被提供给setter。
和计算属性一样,只读下标可以不需要get关键词:
subscript(index: Int) -> Int { // return an appropriate subscript value here }
下面是一个只读下标的实现,定义了一个TimesTable结构来表示一个整数的倍数表:
struct TimesTable { let multiplier: Int subscript(index: Int) -> Int { return multiplier * index } } let threeTimesTable = TimesTable(multiplier: 3) println("six times three is \(threeTimesTable[6])") // prints "six times three is 18"
在这个例子中,实例TimesTable被创建为3倍数表,这是通过在初始化的时候为multiplier参数传入的数值3设置的。
注意:
倍数表是根据特定的数学规则设置的,所以不应该为threeTimeTable[someIndex]元素设置一个新值,所以TimesTable的下标定义为只读。
2、下标的使用
下标的具体含义由使用它时的上下文来确定。下标主要用来作为集合,列表和序列的元素快捷方式。你可以自由的为你的类或者结构定义你所需要的下标。
比如说,Swift中字典类型实现的下标是设置和检索字典实例中的值。可以通过分别给出下标中的关键词和值来设置多个值,也可以通过下标来设置单个字典的值:
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] numberOfLegs["bird"] = 2
上面的例子中定义了一个变量numberOfLegs,然后通过键值对初始化。numberOfLegs的类型是字典类型 Dictionary<String, Int>。在字典创建之后,例子使用了下标赋值方法添加了一个类型为字符串的键”bird”和Int值2到字典中。
更多关于字典的下标可以参考:访问和修改字典这一章节
注意:
Swift中字典类型实现的键值对下标是可选类型。对于numberOfLges字典来说,返回的值是Int?,也就是可选Int值。字典的这种使用可选类型下标的方式说明不是所有的键都有对应的值。同样也可以通过给键赋值nil来删除这个键。
3、下标选项
下标可以接收任意数量的参数,参数的类型也可以各异。下标还可以返回任何类型的值。下标可以使用变量参数或者可变参数,但是不能够使用输入输出参数或者提供默认参数的值。
类或者结构可以根据需要实现各种下标方式,可以在需要的时候使用合适的下标通过中括号中的参数返回需要的值。这种多下标的定义被称作下标重载。
当然,最常见的下标用法是单个参数,也可以定义多个参数的下标。下面的例子演示了一个矩阵Matrix结构,它含有二维的Double值。矩阵结构的下标包括两个整形参数:
struct Matrix { let rows: Int, columns: Int 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 } } }
矩阵Matrix提供了一个初始化方法,使用两个参数rows和columns,然后建立了一个数组来存储类型为Double的值 rows*columns。每个矩阵中的位置都被设置了一个初始值0.0。通过传递初始值0.0和数组长度给数组初始化方法完成上述操作。数组的初始化方 法在:创建和初始化数组中有更详细的叙述。
你可以传递两个参数row和column来完成Matrix的初始化:
var matrix = Matrix(rows: 2, columns: 2)
上面的初始化操作创建了一个两行两列的矩阵Matrix实例。这个矩阵实例的grid数组看起来是平坦的,但是实际上是矩阵从左上到右下的一维存储形式。
矩阵中的值可以通过使用包含row和column以及逗号的下标来设置:
matrix[0, 1] = 1.5 matrix[1, 0] = 3.2
这两个语句调用了下标的setter方法为右上和左下角的两个元素分别赋值1.5和3.2
矩阵下标的getter和setter方法都包括了一个断言语句来检查下标row和column是否有效。通过indexIsValid方法来判断row和column是否在矩阵的范围内:
func indexIsValidForRow(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns }
如果访问的矩阵越界的时候,断言就会被触发:
let someValue = matrix[2, 2] // this triggers an assert, because [2, 2] is outside of the matrix bounds
感谢翻译小组成员:李起攀(微博)、若晨(微博)、YAO、粽子、山有木兮木有枝、渺-Bessie、墨离、矮人王、CXH、Tiger大顾(微博)
个人转载请注明出处和原始链接,商业转载请联系我们~ 感谢您对我们工作的支持~
相关推荐
Swift 中文版最新教程 v1.8 提供了对 Swift 语言的基础到进阶知识的覆盖,适合初学者和有经验的开发者使用。它同样可以作为开发团队负责人、项目负责人在进行项目开发时的参考资料。教程自 2016 年9月23日更新至 ...
### Swift中文教程知识点详解 #### 一、Swift简介与特性 **1.1 关于Swift** Swift 是一种高性能、安全且易于学习的编程语言,由苹果公司在2014年首次发布。它专为iOS、iPadOS、macOS、watchOS 和 tvOS 开发而设计...
本教程为全中文教程,基于Xcode 6.1版本,介绍了Swift的全部最新语法,覆盖了Swift编程语言的基础知识、特性、开发历史以及高级主题。 在Swift语言中,包含了多个重要的概念和特性。例如,它支持基本运算符如加、减...
Swift 编程语言中文版详解 Swift 是一种现代、功能强大、灵活的编程语言,由 Apple 公司开发,旨在为 iOS、macOS、watchOS 和 tvOS 等平台开发应用程序。Swift 语言的设计目标是提供高效、可靠、易于学习和使用的...
类和结构体(Struct)是面向对象编程的基础,它们可以包含属性、方法、下标和初始化器。继承使得一个类可以从另一个类中继承特性,而协议(Protocol)则定义了一组需要遵循的方法和属性,允许类、结构体和枚举遵循。...
2. Swift教程章节:从基础开始,包括基本运算符、字符串和字符处理、集合类型、控制流、函数、闭包、枚举、类和结构体、属性、方法、下标、继承、初始化、析构、自动引用计数(ARC)、可选链式调用等。 3. 语言参考...
10. Swift教程: Swift教程涵盖了Swift的基础部分和语言参考,包括基本运算符、字符串和字符、集合类型、控制流、函数、闭包、枚举、类和结构体、属性、方法、下标、继承、构造和析构过程、自动引用计数、可选链式...
### 关于《Swift Programming Language - v1.2 中文完整版》 #### 一、前言与背景 本文档是对《Swift Programming Language - v1.2 中文完整版》的介绍与解读,该文档旨在为Swift语言的学习者提供全面且深入的理解...
本资源为高清中文版的Swift 4.1教程,由cnswift.org进行翻译,确保了中文用户能更好地理解和学习这一强大的编程工具。 1. **基础内容** (01_基础内容.pdf): - Swift 的基本语法,包括变量与常量的声明(`var` 和 ...
《Swift进阶》是一本关于苹果公司开发的Swift编程语言的高级教程书籍,由Onevcat(喵神)作品,旨在帮助已经具备基础Swift知识的程序员更深入地掌握Swift 4.0版本。本书的英文版于2017年10月出版,随后推出了中文版...
- **第2章 Swift教程**:提供了一个全面的Swift教程,涵盖了从基础知识到高级主题的各种内容。 - **第3章 语言参考**:深入探讨了Swift语言的具体细节,包括语法、类型系统等方面。 - **第4章 苹果官方Blog官方翻译*...