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 ...
随机推荐
- jquery获取<div></div>之间的内容.text() 和 .html()区别
jQuery 获取 div 之间的内容,有两种方法,$(selector).text().$(selector).html() . html: <div> <p>test< ...
- 从头写一个Cucumber测试(二) Cucumber Test
转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test-part-2 承接上文 前一篇博 ...
- sql的一些知识_计算字段
创建计算字段 拼接字段 mysql中 使用concat拼接字段 得到的info可以被客户端使用 算术计算 对检索的数据进行运算并as为新的列名 ) ORDER BY weight
- scheme语言编写执行
scheme是lisp的一种 编辑器能够用emacs.网上有非常多教导怎样编写的 (begin (display "hello") (newline)) 编写完以.scm保存,这里 ...
- mt-checklist 的 bug 解疑 及 防止 this 指针偏移
1.今天在使用 mt-checklist 时,发现 绑定 change 方法后,第一次点击返回的值为 空数组 <template> <div id="app"&g ...
- 小贝_redis hash类型学习
Redis Hash类型 一.查看hash类型的命令 二.操作hash命令具体解释 一.查看hash类型的命令 1.输入 help@hash 127.0.0.1:6379>help @hash ...
- Linux面试必问-对照目录内容的命令“Diff”具体解释
dir1下有个log_1.log dir2下有个log_2.log 两个文件例如以下: p_ylwu@VM_194_111_sles10_64:/home/jdxochen/exercise> ...
- C++输入一行字符串的一点小结
C++输入一行字符串的一点小结 原文链接: http://www.wutianqi.com/?p=1181 大家在学习C++编程时.一般在输入方面都是使用的cin. 而cin是使用空白(空格,制表符和 ...
- ESXi 5.5 RTL9168E网卡驱动 找到网卡
如果你对专业服务器的价格望而却步,恰巧又想在普通的PC上安装ESXi,恰巧又是ESXi 5.5版本,那么这篇文章中提及的问题你可能会遇到,并能给你提供一些帮助. 1.成功安装重启以后提示“no boo ...
- 2018-11-9-匿名函数&递归函数初识
1.匿名函数(lambda) 2.递归函数初识