swift中的方法
方法是关联了特定类型的函数。类,结构体以及枚举都能定义实例方法,方法封装了给定类型特定的任务和功能。类,结构体和枚举同样可以定义类型方法,这是与类型本身关联的方法。类型方法与Objective-C中的类方法相似。
事实上在 结构体和枚举中定义方法是 Swift 语言与 C 语言和 Objective-C 的主要区别。在 Objective-C 中,类是 唯一能定义方法的类型。但是在 Swift ,你可以选择无论类,结构体还是方法,它们都拥有强大的灵活性来在你 创建的类型中定义方法。
一、实例方法
实例方法是属于特定类实例、结构体实力老或者枚举实例的函数。
实例方法与函数的语法完全相同。
实例方法默认可以访问同类下所有其他实例方法和属 性。实例方法只能在类型的具体实例里被调用。它不能在独立于实例而被调用。
1、self属性
每一个类的实例都隐含一个叫做 self的属性,它完完全全与实例本身相等。你可以使用 self属性来在当前实例当中调用它自身的方法。
实际上,你不需要经常在代码中写 self。
1 struct Point {
2 var x = 0.0, y = 0.0
3 func isToTheRightOf(x: Double) -> Bool {
4 return self.x > x
5 }
6 }
除去 self 前缀,Swift 将会假定两个 x 都是叫做 x 的方法形式参数。
2、在实例方法中修改值类型
结构体和枚举是值类型。默认情况下,值类型属性不能被自身的实例方法修改。
总之,如果你需要在特定的方法中修改结构体或者枚举的属性,你可以选择将这个方法异变。然后这个方法就可 以在方法中异变(嗯,改变)它的属性了,并且任何改变在方法结束的时候都会写入到原始的结构体中。方法同 样可以指定一个全新的实例给它隐含的 self属性,并且这个新的实例将会在方法结束的时候替换掉现存的这个实 例。
你可以选择在 func关键字前放一个 mutating关键字来使用这个行为:
1 struct Point {
2 var x = 0.0, y = 0.0
3 mutating func moveBy(x deltaX: Double, y deltaY: Double) {
4 x += deltaX
5 y += deltaY
6 }
7 }
8 var somePoint = Point(x: 1.0, y: 1.0)
9 somePoint.moveBy(x: 2.0, y: 3.0)
10 print("The point is now at (\(somePoint.x), \(somePoint.y))")
11 // prints "The point is now at (3.0, 4.0)"
3、在异变方法里指定自身
1 struct Point {
2 var x = 0.0, y = 0.0
3 mutating func moveBy(x deltaX: Double, y deltaY: Double) {
4 self = Point(x: x + deltaX, y: y + deltaY)
5 }
6 }
这次的异变方法 moveBy(x:y:)创建了一个 x和 y设置在目的坐标的全新的结构体。调用这个版本的方法和的结果 会和之前那个完全一样。
枚举的异变方法可以设置隐含的 self属性为相同枚举里的不同成员:
1 enum TriStateSwitch {
2 case off, low, high
3 mutating func next() {
4 switch self {
5 case .off:
6 self = .low
7 case .low:
8 self = .high
9 case .high:
10 self = .off
11 }
12 }
13 }
14 var ovenLight = TriStateSwitch.low
15 ovenLight.next()
16 // ovenLight is now equal to .high
17 ovenLight.next()
18 // ovenLight is now equal to .off
这个栗子定义了一个三种开关状态的枚举。每次调用 next()方法时,这个开关就会在三种不同的电力状态( Off , low和 high)下切换。
二、类型方法
定义在类型本身调用的方法,被称为类型方法
你可以通过在 func关键字之前使用 static关键字来明确一个类型方法。类同样可以使用 class关键字来允许子类重写父类对类型方法的实现。
注意:在 Objective-C 中,你只能在 Objective-C 的类中定义类级别的方法。但是在 Swift 里,你可以在所有的类里定义类级别的方法,还有结构体和枚举。每一个类方法都能够对它自身的类范围显式生效。
类型方法和实例方法一样使用点语法调用。不过,你得在类上调用类型方法,而不是这个类的实例