博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift3.0P1 语法指南——下标
阅读量:7113 次
发布时间:2019-06-28

本文共 2680 字,大约阅读时间需要 8 分钟。

原档:

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 here4     }5     set(newValue) {6         // perform a suitable setting action here7     }8 }

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

只读下标:

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

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

1 struct TimesTable {2     let multiplier: Int3     subscript(index: Int) -> Int {4         return multiplier * index5     }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 < columns11     }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] = newValue20         }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 < columns3 }

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

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

转载于:https://www.cnblogs.com/tt2015-sz/p/4871145.html

你可能感兴趣的文章
关于URL编码
查看>>
深度学习的可解释性研究(一):让模型「说人话」
查看>>
QT5提示can not find -lGL的解决方法
查看>>
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月17日-9月23日)
查看>>
Tap-Ahead:让移动搜索更加便捷的解决之道
查看>>
Windows Server2016 Hyper-v Cluster部署
查看>>
juniper路由器配置
查看>>
jQuery一点一滴系列教程(第三点)
查看>>
ARP解决方法/工具 真假ARP防范区别方法 ARP终极解决方案
查看>>
系统数据权限的实现方案
查看>>
华为vlan划分,单臂路由以及静态路由
查看>>
UCD 2010百度工作坊
查看>>
ssh2免密码登录
查看>>
4_move_find_into_model
查看>>
MySQL · 捉虫动态 · UK 包含 NULL 值备库延迟分析
查看>>
windows server 2012 standard Evaluation 安装试用
查看>>
windows server 2008中配置TCP/IP
查看>>
网管必读:交换机技术简介及应用分析
查看>>
.NET多线程编程(9)——Thread类
查看>>
HP DL380G6上安装配置Vmware_ESXI4.1
查看>>