swift中的方法

2017-12-18  本文已影响23人  hello_bear

方法是关联了特定类型的函数。类,结构体以及枚举都能定义实例方法,方法封装了给定类型特定的任务和功能。类,结构体和枚举同样可以定义类型方法,这是与类型本身关联的方法。类型方法与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 里,你可以在所有的类里定义类级别的方法,还有结构体和枚举。每一个类方法都能够对它自身的类范围显式生效。

类型方法和实例方法一样使用点语法调用。不过,你得在类上调用类型方法,而不是这个类的实例

上一篇下一篇

猜你喜欢

热点阅读