苹果新的编程语言 Swift 语言进阶(九)--方法和下标
一、方法
方法是与特定类型相关的函数。与属性一样,方法也包括实例方法和类型方法。
类、结构、枚举都能定义实例方法,用来封装或实现给定类型的一个实例相关的功能或特定任务。
类、结构、枚举也能定义与类型本身相关的类型方法。类型方法与Objective-C语言中的类方法相似,类型方法只能在类型本身上调用。
1.1 实例方法的定义
实例方法是属于特定类、结构、枚举的实例的函数,它们用来支持那些实例的功能:提供存取和修改实例属性的方式,或者是提供与实例的功能相关的功能。
实例方法定义采用与函数相同的语法。实例方法在一个类型定义内部定义和实现一个属于它的实例方法,一个实例方法可以存取该类型的所有其它实例方法和属性,并且一个实例方法仅能在它属于的特定类型的实例上被调用,不能脱离实例被调用。如:
class Counter {
var count =0
func increment()
{count++
}
}
该例子在类Counter内部定义了一个实例方法increment。
并用以下方式调用该实例方法:
let counter =Counter()
// the initial counter value is 0
counter.increment()
// the counter's value is now 1
与函数相同,方法的参数也可以有一个本地参数和一个外部参数。
由于Swift对方法的命名采用和Objective-C类似的规则:方法的名字使用介词with、for或者by来标准引用它的第一个参数。因此默认情况,Swift给方法的第一个参数只提供一个本地参数名,而不提供外部参数名,给其它参数则提供本地参数名和外部参数名,这样可以使方法的可读性更强,并能以自然和生动的方式调用该方法。如:
class Counter {
var count:Int =0
func incrementBy(amount:Int,numberOfTimes:Int)
{count +=amount *numberOfTimes
}
}
Counter的实例方法incrementBy带有两个参数amount和numberOfTimes,默认情况下,amount仅作为本地参数名使用,而numberOfTimes作为本地和外部名使用。因此需要这样调用该方法:
let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
有时为方法的第一个参数提供一个外部参数名使有用的,因此你可以明确的为其添加一个外部参数名,或者使用#前缀来使其本地参数名与外部参数名一样。
相反,如果你不想为方法的额外的参数提供一个外部参数名,可以使用(_)符号来明确。
1.2 实例方法的变异
默认情况不能在一个类型为值类型(如结构和枚举)的实例方法内部修改它的属性。但可以通过在该类型的实例方法前面放置一个mutating关键字来允许该方法修改其属性,这称为方法的变异,如下所示:
struct Point {
var x =0.0,y =0.0
mutating func moveByX(deltaX:Double,ydeltaY:Double)
{x +=deltaX
y +=deltaY
}
}
var somePoint =Point(x:1.0,y:1.0)
somePoint.moveByX(2.0,y:3.0)
println("The point is now at (\(somePoint.x),\(somePoint.y))")
// prints "The point is now at (3.0, 4.0)"
需要注意的是不能在一个实例常量上调用变异的方法:
let fixedPoint = Point(x:3.0,
y:3.0)
fixedPoint.moveByX(2.0,y:3.0)
// 将报一个运行时错误。
变异方法还能允许分配一个完全新的实例给隐含的self属性,如下所示:
structPoint {
var x =0.0,y =0.0
mutating func moveByX(deltaX:Double,ydeltaY:Double)
{self =Point(x:x +deltaX,y:y +deltaY)
}
}
该例子在变异方法moveByX内创建了该实例的一个新的实例。
1.3 类型方法
为结构、枚举、类定义类型方法的语法如下:
struct SomeStruct {
static func someTypeMethod()
{
// type method implementation goes here
}
}
class SomeClass {
class fund someTypeMethod()
{
// type method implementation goes here
}
}
为枚举和结构定义类型方法是在方法的func关键字前面添加一个static关键字来指示该方法是类型方法,为类定义类型方法是在所定义方法的func关键字前面添加一个class关键字来指示其是类型方法。
类型方法的作用域是其支持的类型。
与属性相同,类型方法的调用也使用点语法在所支持类型上调用:
SomeClass.someTypeMethod()
在类型方法的方法体内,隐含的self属性引用的是类型本身,因此在类型方法的方法体内使用到的任何方法和属性引用的是其它类型级别的方法和属性,即引用的是其它类型方法和静态属性。
二、下标方法
类、结构和枚举都能定义下标方法,用来快捷存取一个集合、列表、或序列的成员。
通过为某个类型定义下标方法,就可以使用索引来设置和获取类型实例包含的成员值。如数组和词典类型都提供了下标方法,因此可以使用索引来存取一个数组或词典的值。
2.1 下标方法定义
下标方法的定义语法与实例方法和计算属性的语法类似。
下标方法使用subscript关键字来指示是一个下标方法。与实例方法一样,下标方法定义中可以规定一个或多个输入参数,并带有一个返回类型。与实例方法不同的是下标方法可以是可读写的或是只读的。与计算属性的定义一样,下标方法通过使用getter和setter来传达下标方法的行为。如果在下标方法的定义中getter和setter都被指定,则定义了一个可读写的下标方法,如果下标方法的定义中不包含setter,则定义了一个只读的下标方法,并且这时代表getter方法的关键字get也可以省略。下标方法定义的完整语法如下:
subscript(index:Int)
->Int {get {
// return an appropriate subscript value here
}
set(newValue)
{// perform a suitable setting action here
}
}
该例定义了一个可读写的下标方法,newValue可以指定,也可以不指定,不指定时使用默认的参数名newValue。
如下例子展示了一个只读下标方法的定义和使用。由于只读下标方法只指定一个getter,意义是明确的,因此可以省略get关键字。
struct TimesTable {
let multiplier:Int
subscript(index:Int)
->Int {return multiplier
*index}
}
let threeTimesTable =TimesTable(multiplier:3)
println("six times three is\(threeTimesTable[6])")
// prints "six times three is 18”
2.2 下标方法的使用
你能为一个类型定义和实现多个下标方法,编译器基于你传送给下标方法的索引参数的类型来推断和选择适当的下标方法。
与方法类似,下标方法可以包含任意数量的输入参数,且这些输入参数的类型可以是任何类型,下标方法也能返回任何类型。下标方法也能使用可变参数,但不能使用in-out参数也不能通过默认参数值。
如可以定义一个带有多个输入参数的表示多纬度的下标方法,下面的例子展示了如何为一个矩阵结构定义一个带两个整数类型的下标方法以及如何使用,定义的下标方法用来索引矩阵中定义的两纬度的元素。
struct Matrix {
let rows:Int,columns:Int
var grid:Double[]
init(rows:Int,columns:Int)
{self.rows
=rowsself.columns
=columnsgrid =Array(count:rows
*columns,repeatedValue:0.0)}
subscript(row:Int,column:Int)
->Double {get {
return grid[(row
*columns) +column]}
set {
grid[(row
*columns) +column] =newValue}
}
}
var matrix
=Matrix(rows:2,columns:2)matrix[0,1]
=1.5matrix[1,0]
=3.2
版权所有,转载时请清楚注明链接和出处,谢谢!
苹果新的编程语言 Swift 语言进阶(九)--方法和下标的更多相关文章
- 苹果新的编程语言 Swift 语言进阶(一)--综述
Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...
- 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...
- 苹果新的编程语言 Swift 语言进阶(十五)--协议
协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...
- 苹果新的编程语言 Swift 语言进阶(十四)--扩展
扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...
- 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类
Swift语言中,具有类特征的类型包括三种,即枚举类型.结构类型(包括基本类型,基本类型实际都是结构类型的特例).类.其中枚举类型.结构类型是属于值类型,类属于引用类型.三种类型都可以添加属性.方法. ...
- 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型
一.字符串( String )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...
- 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型
一 . 常量和变量 Swift语言 对常量和变量的声明进行了明确的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确. 常量和变量的区别是常量在设置或初始化后 ...
- 苹果新的编程语言 Swift 语言进阶(五)--控制流
Swift 语言支持C语言全部的控制语句.包含for 和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...
- 苹果新的编程语言 Swift 语言进阶(十六)--泛型
泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...
随机推荐
- 协议系列之TCP协议
3.TCP协议 从上一节我们了解了什么是IP协议,以及IP协议的一些特性,利用IP协议传输都是单向的,不可靠的,无连接状态的.正是这些特性,于是便产生了TCP协议.TCP协议属于传输层,在IP协议网络 ...
- GC垃圾回收算法
什么是GC垃圾回收呢.日常生活中我们去餐厅吃饭吃完饭,吃完饭走了餐具不用管,服务员在把餐具拿走,这是一种方式,服务员怎么知道他要来把餐具拿走呢,因为你走了,这个位置空了.服务员什么时候拿走餐具很重要, ...
- [virtualenv]生产环境中使用virtualenv
virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中 ...
- iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
1.基本使用 UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建: [[UIActivityViewController a ...
- Libgdx教程目录
Libgdx教程 Note:本教程用的Libgdx 1.9.2版本,在教程更新完毕之前应该不会更新版本.之前的博客中也发表过Libgdx的内容,不过当时都从别人那里拷贝的,因此现在想做一个Libgdx ...
- Java-IO之BufferedInputStream(缓冲输入流)
BufferedInputStream是缓冲输入流,继承于FilterInputStream,作用是为另一个输入流添加一些功能,本质上是通过一个内部缓冲数组实现的.例如,在新建某输入流对应的Buffe ...
- python中MySQLdb的使用
先举一例: 一个 Python代码实例: # -*- coding: utf-8 -*- #mysqldb import time, MySQLdb #连接 ...
- DB 查询分析器 6.04 在 Windows 10 上的安装与运行展示
DB查询分析器 6.04 在 Windows 10 上的安装与运行展示 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员 http://www.csdn.net/art ...
- git常用技巧
一般的过程: ①如果还没有库先用 git clone 克隆一个库. ②使用 git checkout master切换到master分支. ③使用 git pull 同步远程master分支(即git ...
- Java进阶(二)文件读操作
本文以实际的读取文件为例子,介绍流的概念,以及输入流的基本使用. 按照前面介绍的知识,将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流--InputStream或Reader.而由 ...