本文将同时阐述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属性

类型的每一个实例都有一个隐含属性叫做selfself完全等同于该实例本身。你可以在一个实例的实例方法中使用这个隐含的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下表和方法的更多相关文章

  1. oracle下导出某用户所有表的方法

    oracle下导出某用户所有表的方法 scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/tiger@handso ...

  2. centos环境下创建数据库和表的方法

    centos环境下创建数据库和表的方法 //查询数据库的命令: mysql> SHOW DATABASES; +--------------------+ | Database         ...

  3. 【Swift学习】Swift编程之旅---方法(十五)

    在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...

  4. Swift编程语言中的方法引用

    由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...

  5. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  6. Masonry 在swift下的使用

    Masonry在oc下使用很方便,但是在swift下,由于oc方法和property都可以使用.fuc的语法,swift下只有属性可以使用.property的语法,方法只能写成.func().因此在s ...

  7. 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 ...

  8. Swift下自定义xib添加到Storyboard

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51657154 ...

  9. 表驱动方法(Table-Driven Methods)

    表驱动方法(Table-Driven Methods) - winner_0715 - 博客园 https://www.cnblogs.com/winner-0715/p/9382048.html W ...

随机推荐

  1. 转: WebRTC音视频引擎研究(1)--整体架构分析

    转自: http://blog.csdn.net/temotemo/article/details/7530504   目录(?)[+]   WebRTC技术交流群:234795279 原文地址:ht ...

  2. 直接返回list不封装的结果集

    直接返回list不封装的结果集,在Jsp访问方式: 1.封装成map访问 2.用jstl: <c:forEach var="images" items="${lis ...

  3. hibernate 自动封装

    一.查询全部对象属性的封装则比较简单 Query query = this.getSession().createSQLQuery(queryString).addEntity(pojoClass); ...

  4. Android_动态权限管理的解决方式

    本博文为子墨原创.转载请注明出处! http://blog.csdn.net/zimo2013/article/details/50478201 1.前言 (1).因为MIUI等部分国产定制系统也有权 ...

  5. 系统安全-Man in the middleattack

    窃听VS加密(解决数据机密性) 加密由两部分组成:算法&秘钥(算法要够复杂,秘钥要够安全) 对称加密:(Symmetric encryption) 采用单秘钥密码系统的加密方法,同一个秘钥可以 ...

  6. MacBook Pro使用初体验之Mac快捷键汇总(持续更新中)

    我于近日购置了一台13寸的MacBook Pro高配,打算開始进行iOS开发的学习.Pro的配置情况例如以下: (1)OS X Yosemite ,版本号10.10.3 (2)Retina显示屏,13 ...

  7. hdu5317 RGCDQ 统计

    // hdu5317 RGCDQ // // 题目大意: // // 给定一个闭区间[l,r],定义f(x)是x的不同的质因子的个数 // 比方: 12 = 2 * 2 * 3,是两种.所以f(x) ...

  8. POJ 2263 Heavy Cargo(ZOJ 1952)

    最短路变形或最大生成树变形. 问 目标两地之间能通过的小重量. 用最短路把初始赋为INF.其它为0.然后找 dis[v]=min(dis[u], d); 生成树就是把最大生成树找出来.直到出发和终点能 ...

  9. js比较3个数字的大小

    <script> var a = [1, 5, 2, 123, 34, 43, 7]; var i = j = t = 0; //sort方法, 推荐使用 a.sort(function( ...

  10. The Little Match Girl,摘自iOS应用Snow White and more stories

    Many years ago on a cold and snowy New Year's Eve, a poor little girl was wandering arround on the s ...