十、方法 Methods

1. 概述

方法 Methods 与函数类似,它是与某种类型(比如类、结构体、枚举)关联起来的函数 Function。关于Function,参考第五章函数

2. 方法的内部和外部参数名

Methods 的内部和外部参数名与 Function 类似,但是略有不同。

在Swift中,编译器默认会给 Methods 的第一个参数一个内部参数名 local parameter name,第二个后之后的参数给予内部和外部参数名 local and external parameter names。

    class Counter {
        var count: Int = 0
        func incrementBy(amount: Int, numberOfTimes: Int) {
            count += amount * numberOfTimes
        }
    }

可以在第二个参数前加上 (#),是这种规则明确生效。——实际上是速记外部参数名。

    func incrementBy(amount: Int, #numberOfTimes: Int) {
      count += amount * numberOfTimes
    }

你也可以在第一个参数前加上(#),为第一个参数添加一个外部参数名。

有时你会希望覆盖掉上面编译器默认的命名行为,通过下划线(_),明确的表名参数名为外部参数名。

3. 在实例的方法中更改值类型 Modifying Value Types from Within Instance Methods

Structures 和 enumerations 是 Value Types 。默认情况下,值类型的实例不能更改值类型的属性 (原话是:the properties of a value type cannot be modified from within its instance methods.)。

如果你想通过某个方法更改结构体或枚举的属性,可以在方法前加上 mutating 关键字,表明可以在这个方法中改变(mutate or change)它的属性,这个方法所做的任何改变将会在它结束时,写回原来的结构体;这个方法甚至可以给它的 self 属性赋值,那么当这个方法结束时,新的实例将覆盖掉原来的实例。

    struct Point {
      var x = 0.0, y = 0.0
      mutating func moveByX(deltaX: Double, y deltaY: 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)"

注意:你不能在 constant 型结构体中定义mutating 方法,因为即使它的属性为 variable 类型,也无法被改变。

    let fixedPoint = Point(x: 3.0, y: 3.0)
    fixedPoint.moveByX(2.0, y: 3.0)
    // this will report an error

4. 在 Mutating 方法中给 self 赋值 Assigning to self Within a Mutating Method

4.1 Mutating 在结构体中使用

    struct Point {
      var x = 0.0, y = 0.0
      mutating func moveByX(deltaX: Double, y deltaY: Double) {
        self = Point(x: x + deltaX, y: y + deltaY)
      }
    }

上面版本中,调用实例的 moveByX 方法时,新的实例将覆盖掉原来的实例。

4.2 Mutating 在枚举中的使用

 完成枚举一节后再继续本节内容。。。

原文地址:https://www.cnblogs.com/actionke/p/4228952.html