包含内容:
- 实例方法
- 类型方法
方法
swift
与C
和Obuect-C
的主要区别就是结构体和枚举可以定义方法。
一、实例方法
实例方法是属于一个特定的类、结构体或枚举的实例的函数,函数是实例的支柱,通过提供访问实例属性和修改实例属性的方法,或提供相关实例功能的目的。实例方法和函数有相同的语法,就像功能的描述。
一个实例方法只能被它所属的类的特定实例调用
例:定义一个Counter类,Counter能被用来对一个动作发生的次数进行计数
class Counter {
var count = 0
func increment() {
count += 1
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
//Counter 类定义了三个实例方法:
//increment 计数器增量加1
//incrementBy(amount:Int) 计数器由特定的整数作为增量
//reset 重置计数器的增值为0
//该Counter类也定义了一个属性变量count,用来维持当前计数器的值的轨道。
方法的局部和外部参数名
swift函数的参数可以拥有一个局部名称(在函数体内使用)和一个外部名称(在调用函数时使用)作为外部参数名的描述。
class Counter2 {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
Counter2类中的incrementBy方法有两个参数,默认情况下,swift将amount视为唯一的局部名称,但将numberOfTimes同时视为局部名称和外部名称
let counter = Counter2()
counter.incrementBy(amount: 5, numberOfTimes: 3)
相反的如果不想显示的使用外部参数名,则可以使用_
来替代参数名,一般显示的使用外部参数名使调用函数时参数意义更明确
func Test(amount: Int, _: String) -> Int{
return amount
}
let A = Test(amount:5, "OK")
self 属性
每一个类型的实例都有一个称为self的隐式属性,它是完全等同于该实体本身的。
主要的异常发生在一个实例方法的参数名和实例的属性名相同。在这种情况下,参数名有限,有必要参考属性更多的合格方式,可以用隐式的self属性区分参数名和属性名
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x
}
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOf(x:2.0) {
print("self.x > x")
}
修改值类型的实例方法
结构体和枚举都是值类型。默认情况下,值类型的属性不能从它的内部实例方法修改。如果你需要修改结构体或者枚举的属性在一个特定的方法中,可以在这个方法中选择加入变异行为。通过mutating
关键字写在方法的func关键字前
struct Point2 {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint2 = Point2(x: 1.0, y: 1.0)
somePoint2.moveByX(deltaX:2.0, y: 3.0)
print(somePoint2.x, somePoint2.y)
上面的Point2结构体定义了一个变异的moveByX方法,它通过一定量移动一个Point2实例,mutating关键字添加到方法的定义上,使它能够修改它的属性。
由变异方法分配self
变异方法可以分配一个全新的实例给隐式的self属性。
struct Point3 {
var x = 0.0, y = 0.0
mutating func moveByXY(deltaX: Double, y deltaY: Double) {
self = Point3(x: x + deltaX, y: y + deltaY)
}
}
二、类型方法
//类型方法:由类型自身调用的方法。func关键字前面写上class关键字来声明类的类型方法,而在结构体或枚举内定义类型方法则需要在关键字前书写static关键字来声明
class SomeClass {
class func someTypeMethod() {
//
}
}
SomeClass.someTypeMethod()
PS:在类型方法体中,self指向这个类型本身,而不是类型的某个实例。这意味着你可以用self来消除类型属性和类型方法参数之间的歧义。
网友评论