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 ...
随机推荐
- log4net日志组件经验分享
引自log4net日志组件经验分享 我们在开发WEB项目的时候,经常会出现这样的情况:在本地调试都是正常的,但是部署到服务器上就不行了.一般出现这种情况很大一部分原因是因为服务的环境和本地不同,数据库 ...
- [Django] 查看orm自己主动运行的原始查询sql
django的文档看了非常多.也用了不少,有的时候感觉性能非常不好,知道非常多地方是惰性查询.可是对于复杂的逻辑.仅仅是表面上发现执行非常慢,机器资源消耗非常多.却不知道orm究竟是什么来转化成sql ...
- 淘宝HSF 框架使用 总结
@(JAVA开发) 淘宝HSF 框架使用 总结 随着网站访问量增加,仅仅靠增加机器已不能满足系统的要求,于是需要对应用系统进行垂直拆分和水平拆分.在拆分之后,各个被拆分的模块如何通信?如何保证性能?如 ...
- 算法——字符串匹配之BM算法
前言 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左開始比較,但模式串的移动依旧是从左到右的.在实践中.BM算法效率高于前面介绍的<KM ...
- react request.js 函数封装
1.request.js 函数封装 import { Toast } from 'antd-mobile'; import axios from 'axios'; import store from ...
- nyoj43 24 Point game(DFS)
题目43 题目信息 pid=43" style="text-decoration:none; color:rgb(55,119,188)">执行结果 本题排行 讨论 ...
- 话说Session
Session这个概念,对于搞软件的来说,再熟悉不过了.就拿我来说,Hibernate, Shiro, Spring, JSP, Web Server等等,全都涉及到Session. 不怕笑话,一直都 ...
- 互联网金融MySQL优化参数标准
InnoDB配置 从MySQL 5.5版本开始,InnoDB就是默认的存储引擎并且它比任何其它存储引擎的使用要多得多.那也是为什么它需要小心配置的原因. innodb_file_per_table 表 ...
- ZooKeeper学习笔记(一)
引导 刚开始学习ZooKeepter,看的书是[O'Reilly Media] ZooKeeper.下面的内容基本上是该书的翻译,很多语句也存在问题,大致读还是没问题的,自己在学习中记录. 第一章 Z ...
- Darwin Streaming Server编译
EasyDarwin是我们在Darwin Streaming Server的基础上进行开发和扩展的,Windows/Linux编译,包括64位编译补丁,我们都进行了整理和测试,后续还会不断进行迭代和扩 ...