苹果新的编程语言 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
=rows

self.columns
=columns

grid =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.5

matrix[1,0]
=3.2

版权所有,转载时请清楚注明链接和出处,谢谢!

苹果新的编程语言 Swift 语言进阶(九)--方法和下标

时间: 2024-10-05 02:36:48

苹果新的编程语言 Swift 语言进阶(九)--方法和下标的相关文章

苹果新的编程语言 Swift 语言进阶(十四)--扩展

Swift语言的扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能.        扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名字.        扩展能够为已存在类型:     1)增加计算属性和计算静态属性:     2)定义新的实例方法和类型方法:     3)提... 请转移到此位置继续阅读,谢谢! 苹果新的编程语言 Swift 语言进阶(十四)--扩展 苹果新的编程语言 Swift 语

苹果新的编程语言 Swift 语言进阶(八)--属性

请转移到此位置阅读,谢谢! 苹果新的编程语言 Swift 语言进阶(八)--属性 http://blog.csdn.net/goohong/article/details/32096289 苹果新的编程语言 Swift 语言进阶(八)--属性,布布扣,bubuko.com

苹果新的编程语言 Swift 语言进阶(十五)--协议

协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图.       协议与java 语言中的接口定义类似,都是描述了一个实现可以干什么,而本身却不包含任何实现.与接口不同的是swift语言定义的协议可以被一个类.结构.或者枚举采用,来提供协议规定需求的实际实现,而java 语言的接口只能被类实现.   ... 请麻烦转移到此位置阅读,谢谢! 苹果新的编程语言 Swift 语言进阶(十五)--协议 苹果新的编程语言

苹果新的编程语言 Swift 语言进阶(十一)--实例的初始化与类的析构

一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程.初始化包括设置一个实例的每一个存储属性为一个初始值,以及执行任何其它新的实例能够使用之前需要的设置或初始化. 一个类.结构或枚举能定义一个初始化方法来设置它的特性,用来确保它的实例的所有属性都有有效的初始值. 通过调用类.结构或枚举提供的初始化方法来执行实例的初始化过程. 类的实例也能实现一个析构,用来在类的实例释放之前执行任何特定的清除过程来释放分配的专有资源. 1 . 初始化方法的定义 初始化方法

苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类

一. 枚举 枚举定义了一种包含一组相关值的公共类型.枚举是Swift中的一种与类类似的类型,具有许多传统类才有的特征,例如计算属性.实例方法,能够通过扩展或协议增强功能等. 1.1 枚举定义 Swift 语言的枚举类型的定义语法如下: enum CompassPoint { case North case South case East case West } 枚举语法以一个关键字enum来标识,enum后面包含一个枚举类型名字,枚举定义全部放到一对大括号中. 在枚举中定义的值称为枚举成员值,用

苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

一 基本操作运算 1. 赋值操作 在Swift 中,可以使用赋值操作为一个常量或一个变量赋值,也可以使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其它语言最大的不同是赋值操作除了能够为变量或常量赋值外本身不能够返回值. 这个特征可以避免某些条件下赋值操作错误地用于相等比较操作. 如在C语言中,if (x = =y) 很容易误写作if (x = y) ,虽然逻辑结果不正确,但C语言的编译器却无法检查出这种情况,而Swift 语言却可以有效避免这种情况发生,因为 在Swift 中if

苹果新的编程语言 Swift 语言进阶(一)--综述

Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便和高效,Swift在语法上作了大量的优化和改进. Swift采用安全编程模式,具有许多先进的强大的功能 ,如动态运行时.编译动态进行类型检查.Closures.下标功能.自动引用计数.选项类型.通用类型和类型编译时推断.类型的扩展和嵌套.协议类型.功能和类型的通用化.操作符的定制和添加. Swift

苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的组合,并提供相应方法来获取以各种Unicode呈现方式包含的字符. 1. 字符串定义和初始化 Swift 语言使用var或let关键字来定义一个常量字符串(不可修改)或变量字符串(可以修改).  而不是像Object C语言一样定义两种不同的类型. Swift 语言允许使用一个双引号的字符串来初始化

苹果新的编程语言 Swift 语言进阶(十六)--泛化

泛化允许你定义一个宽松.可重用的函数或者类型,使用泛化能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛化是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛化来创建,如Swift提供的数组和词典类型.通过使用泛化,你能使用一个数组和词典来包含和存储任何类型的元素. 1.1 泛化函数 使用Swift语言你能定义一个可以工作于任意类型的泛化函数,从而不必为每种类型都定义一个具有相同功能的函数,这样就可以大大减少代码的重复. 如对一个实现任意类型值交换(swap)