Swift3.0P1 语法指南——下标
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 语法指南——下标的更多相关文章
- Swift3.0P1 语法指南——类和结构体
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——闭包
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——构造器
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——继承
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——方法
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——属性
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——枚举
原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...
- Swift3.0P1 语法指南——函数
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——集合类型
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
随机推荐
- 手机网页Html代码实现(解决显示页面很小的问题)
工作需要,要做一个手机自适应的网页效果,终于搞定,先分享并记录! 其实主要就是改掉HTML页面声明: 在网页中加入以下代码,就可以正常显示了: <meta name="viewport ...
- Vue系列:在vux的popup组件中使用百度地图遇到显示不全的问题
问题描述: 将百度地图封装成一个独立的组件BMapComponent,具体见 Vue系列:如何将百度地图包装成Vue的组件(http://www.cnblogs.com/strinkbug/p/576 ...
- Swagger+AutoRest 生成web api客户端(.Net)
简介 对于.net来说,用web api来构建服务是一个不错的选择,都是http请求,调用简单,但是如果真的要在程序中调用,则还有些工作要做,比如我们需要手写httpClient调用,并映射Model ...
- CSS基本知识5-CSS对齐
要对齐的关键,在于理解块,行的概念,块的对齐主要靠自动计算定位,比如margin:auto,及浮动,所以最好的办法是尽量使用行来对齐. 实例: .box { border: 1px solid #80 ...
- 尝试使用Memcached遇到的狗血问题
乘着有时间,尝试下利用Memcached进行分布式缓存,其中遇到了不少问题及狗血的事情,开篇记录下,希望对您有帮助. 我之前的项目为:Asp.Net MVC4 + Nhibernate + MSSQL ...
- 持续集成(Continuous integration)
docker +jenkins + gitosc 到gitosc上,复制地址:https://git.oschina.net/99fu/CI.git 进入到 /home/fu git clone ...
- HTTP协议(二):header标头说明
Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes Age 从原始服务器到代理缓存形成的估算时间(以秒计 ...
- transform
{ transform: scale3d(x,y,z) /*放大*/ translate3d(x,y,z) /*位置*/ rotate3d(x,y,z,angle) /*旋转*/ skew(x-ang ...
- Python【第三章】:python 面向对象 (new)
面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...
- php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
虽然通过nginx accesslog可以记录用户访问某个接口或者网页所消耗的时间,但是不能清晰地追踪到具体哪个位置或者说函数慢,所以通过php-fpm慢日志,slowlog设置可以让我们很好的看见哪 ...