Swift下表和方法
本文将同时阐述Swift的方法和下标,因为根据我的理解,从某种程度上讲,下标的本质也是方法。
方法
众所周知,在支持面向对象的语言里,方法一般分为两种:实例方法和类方法(在有的语言中,「类方法」被称为「静态方法」)。
Swift也不例外,只是考虑到类、结构体和枚举都可以定义这两种方法,所以「类方法」这个名词在Swift中不太实用了,Swift方法分为「实例方法」和「类型方法」。
实例方法
实例方法的形参名
实例方法和函数差不多(实例方法本来就是函数,只是这个函数与某个类型相关联),细节方面的东西就不赘述了(具体的参考Swift Functions);但有两点不同:
- 相对于函数,Swift对实例方法的形参名要求更多;
- 在实例方法中,常常会用到一个关键的属性
self;
举个栗子,如下Counter类定义了三个实例方法:
class Counter {
var count =
func increment() {
++count
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count =
}
}
Swift中的方法和OC中的方法极其相似。像在OC中一样,Swift中方法的名称通常用一个介词指向方法的第一个参数,比如:with,for,by等等。前面的Counter类的例子中incrementBy方法就是这样的,介词的使用让方法在被调用时能像一个句子一样被解读。和函数参数不同,对于方法的参数,Swift使用不同的默认处理方式,这可以让方法命名规范更容易写。
具体来说,Swift默认仅给方法的第一个参数提供一个内部参数名;默认同时给第二个和后续的参数提供内部参数名和外部参数名。这个约定与典型的命名和调用约定相适应,与你在写OC的方法时很相似。这个约定还让表达式方法在调用时不需要再限定参数名称。
简单来说,Swift为实例方法提供的默认处理是:
- 为第一个参数仅提供内部参数名(local parameter name);
- 为第二个以及之后的参数同时提供外部参数名和内部参数名;
如下:
class Counter {
var count: Int =
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
// 使用
let counter = Counter()
counter.incrementBy(, numberOfTimes: )
// counter value is now 15
可以看到,不必为第一个参数再定义一个外部变量名:因为从函数名incrementBy已经能很清楚地看出它的作用。但是第二个参数,就要被一个外部参数名称所限定,以便在方法被调用时明确它的作用。
这种默认的行为能够有效的处理方法(method),类似于在参数numberOfTimes前写一个#:
func incrementBy(amount: Int, #numberOfTimes: Int) {
count += amount * numberOfTimes
}
这种默认行为使上面代码意味着:在Swift中定义方法使用了与OC同样的语法风格,并且方法将以自然表达式的方式被调用。
但有时候我们不想使用Swift对实例方法参数名的处理方式,解决方法:
- 为第一个参数提供外部参数名,直接添加一个外部参数名即可,或者直接添加
#; - 取消index>1的参数的外部参数名,在参数名前加上一个
_即可;
self属性
类型的每一个实例都有一个隐含属性叫做self,self完全等同于该实例本身。你可以在一个实例的实例方法中使用这个隐含的self属性来引用当前实例。
self的使用比较简单,不赘述了。
Mutable方法
对于值类型(即枚举、结构体)实例而言,默认情况下,是不允许在实例方法中修改属性值的(对于引用类型实例则不存在这个问题)。如果实在有需要修改呢?在值类型的实例方法定义式中加上前缀mutating修饰即可。如下:
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x: Double) -> Bool {
return self.x > x
}
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOfX(1.0) {
println("This point is to the right of the line where x == 1.0")
}
// prints "This point is to the right of the line where x == 1.0"
类型方法
实例方法是被类型的某个实例调用的方法。你也可以定义类型本身调用的方法,这种方法就叫做「类型方法」。
类型方法的定义
和Swift的「类型属性」类似,对于值类型,定义「类型方法」时使用关键字static修饰;对于引用类型,修饰「类型方法」既可以使用static又可以使用class,只是前者不允许子类override该方法,后者允许该「类型方法」被子类overridden。
除了定义使用的关键字之外,「类型方法」的其他信息没啥特别的,本文略过!
下标
在Swift中,类、结构体和枚举中都可以定义「下标」(subscripts),可以认为「下标」是访问对象、集合或序列的快捷方式。使用「下标」,你可以基于index设置和读取指定的实例数据,而不需要另外编写其他的逻辑代码。举例来说,用「下标」访问一个数组(Array)实例中的元素可以这样写someArray[index],访问字典(Dictionary)实例中的元素可以这样写someDictionary[key]。
类型可以定义多个subscripts,通过索引值类型的不同来进行重载,而且索引值可以是多个。
下标语法
Swift中的「下标」允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例的指定数据进行访问和赋值。语法类似于「实例方法」和「计算型属性」的混合,与定义「实例方法」类似,「下标」使用subscript关键字,显式声明传入参数(一个或多个)和返回类型;与「实例方法」不同的是「下标」可以设定为读写或只读,这种方式又有点像计算型属性的getter和setter,如下:
subscript(index: Int) -> Int {
get {
// return an appropriate subscript value here
}
set(newValue) {
// perform a suitable setting action here
}
}
使用下标
根据使用场景不同「下标」也具有不同的含义。通常使用「下标」用来访问集合、列表或序列中元素的快捷方式。你可以在你自己特定的类或结构体中自由地实现「下标」来提供合适的功能。例如,Swift的字典实现了通过「下标」来对其实例中存放的值进行存取操作。在「下标」中使用和字典索引相同类型的值,并且把一个字典值类型的值赋值给这个「下标」来为字典设值:
var numberOfLegs = ["spider": , "ant": , "cat": ]
numberOfLegs["bird"] =
注意:Swift中字典的「下标」实现中,在get部分返回值是Int?,上例中的numberOfLegs字典通过下边返回的是一个Int?或者说「可选的Int」,毕竟不是每个字典的索引都能得到一个整型值,对于没有设过值的索引的访问返回的结果就是nil;同样想要从字典实例中删除某个索引下的值也只需要给这个索引赋值为nil即可。
Swift的「下标」的类似于C++中「运算符重载」,相对于OC,它算是Swift语言的一个重要特性了,但其使用并不复杂。
Swift下表和方法的更多相关文章
- oracle下导出某用户所有表的方法
oracle下导出某用户所有表的方法 scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/tiger@handso ...
- centos环境下创建数据库和表的方法
centos环境下创建数据库和表的方法 //查询数据库的命令: mysql> SHOW DATABASES; +--------------------+ | Database ...
- 【Swift学习】Swift编程之旅---方法(十五)
在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...
- Swift编程语言中的方法引用
由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...
- 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法
几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...
- Masonry 在swift下的使用
Masonry在oc下使用很方便,但是在swift下,由于oc方法和property都可以使用.fuc的语法,swift下只有属性可以使用.property的语法,方法只能写成.func().因此在s ...
- iOS 11 导航栏 item 偏移问题 和 Swift 下 UIButton 设置 title、image 显示问题
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Swift下自定义xib添加到Storyboard
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51657154 ...
- 表驱动方法(Table-Driven Methods)
表驱动方法(Table-Driven Methods) - winner_0715 - 博客园 https://www.cnblogs.com/winner-0715/p/9382048.html W ...
随机推荐
- 系统网站架构(淘宝、京东)& 架构师能力
来一张看上去是淘宝的架构的图: 参考地址:http://hellojava.info/?p=520 说几点我认可的地方: 架构需要掌握的点: 通信连接方式:大量的连接通常会有两种方式: 1. 大量cl ...
- 2.nginx整合PHP
/usr/local/src/下都有什么:.tar.gz文件和解压之后的源码 /usr/local/下都有什么:源码编译之后的东西 安装mysql客户端 安装mysql服务端 启动mysql服务端 s ...
- 在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver
在CentOS 7上构建RAID5.LVM和SAMBAserver(5)--架设SAMBAserver 6. 架设SAMBAserver 6.1. 预备 本节的任务是配置SAMBA服务,共享/home ...
- One usage of recurison: the tower of Hanoi
Statements: This blog was written by me, but most of content is quoted from book[Data Structure wit ...
- 验证loadrunner对Ajax内容的校验
前一阵和开发的同事一起測试某个系统的性能.此系统是发送Ajax请求到后台,再调用第三方的某项服务. 第三方服务的性能由不得我们控制.因此开发者做了一下改进.超时则直接返回. 于是在loadrunner ...
- 使用Nightwatch.js做基于浏览器的web应用自动测试
1 安装 1.1 安装Node.js 在http://nodejs.org/ 上下载适合本机系统的安装包运行安装,注意安装选项中选择npm tool以用于后续依赖包的安装. 1.2 ...
- ARM architecture
http://en.wikipedia.org/wiki/ARM_architecture ARM architecture ARM architectures The ARM logo De ...
- laravel 配置了自己的域名以后, localhost 无法访问 404 not found 的解决方法
这是后盾网视频教程的方法,应该是配置虚拟主机,此方法要改动,apache服务器里的conf文件夹里的httpd.conf文件 和conf/extral里面的httpd-vhost文件 具体改动为,co ...
- 轻松搞定RabbitMQ(四)——发布/订阅
转自 http://blog.csdn.net/xiaoxian8023/article/details/48729479 翻译地址:http://www.rabbitmq.com/tutorials ...
- spring boot Mybatis多数据源配置
关于 有时候,随着业务的发展,项目关联的数据来源会变得越来越复杂,使用的数据库会比较分散,这个时候就会采用多数据源的方式来获取数据.另外,多数据源也有其他好处,例如分布式数据库的读写分离,集成多种数据 ...