iOS Swift No.11 - 方法 1

第十一章 方法

方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法 (Instance method),实例方法为某些给定类型实例封装了特殊任务和功能。类,结构体和枚举都可以用来定义类型方法(Type Method),而类型方法与类型本身相关联,类型方法和Objective-C里面的Class Method类似。在Swift里面结构体和枚举可以定义方法这是与C和Objective-C里面最大的不同,而在Objective-C里面类是唯一的一种可以定义方法的类型。我们可以在Swift里面用类结构体或枚举来定义方法,并且还可以灵活地在创建的类里面定义方法。

1. Instance Method (实例方法)

实例方法是属于某个类,结构体或枚举的函数,实例方法提供访问和修改实例属性的方法或提供与实例目的相关的功能,并以此来支撑实例的功能,实例方法的语法和函数的语法是一样的。

实例方法可以写在与类相关的前后大括号里,一个实例方法能够隐式访问它所属类型的所有的其他实例方法和属性。实例方法只能被它所属的类型所调用。实例方法不能脱离于现存的实例而被调用。

class Counter {
    var count = 0
    // Counter类的实例方法与函数语法相同
    func increment() {
        count += 1
    }
    func increment(by amount: Int) {
        count += amount
    }
    // 让类Counter里面的变量属性重置为0
    func reset() {
        count = 0
    }
}

上面的Counter类定义了下面三个实例方法

  1. increment() 以+1的方式来递增
  2. increment(by amount: Int) 以某个整数值的方式来递增
  3. reset() 重置为0
// 类Counter里面count初始值为0
let counter = Counter()
// 调用实例方法
counter.increment()
// 传参并调用
counter.increment(by: 5)
counter.reset()

1.1 The Self Property (Self 属性)

每一个类型的实例都有一个隐含的self属性,self属性和它的实例是相等的。在实例方法里面可以用self属性来引用当前实例。

func increment() {
    self.count += 1
}

实际上并不用在代码里经常写self,无论什么时候只要在一个方法中使用一个已知的属性或者方法名称,如果你没有明确地写self ,Swift 都会假定你是指引用当前实例的属性或者方法。

实例的参数名和实例的属性名称相同的情况下,实例的参数名称享有优先权,就可以用self来区分。这种情况下要写self,调用self属性的时候为了不让运行出现混乱 通常会优先在参数名里面使用self。不用写self的情况除非实例的参数名和实例的属性名称不同的情况下。可以省略self,swift都引用当前实例或方法。

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: 1.0) {
    print("This point is to the right of the line where x == 1.0")
}
// 输出:"This point is to the right of the line where x == 1.0"

1.2 Modifying Value Types from Within Instance Methods (在实例方法中修改值类型)

结构体和枚举都是值类型默认情况下。值类型的属性是不能在实例方法中修改的。然而想要在实例方法里面修改结构体或枚举的属性时,可以选择在方法前面添加mutating关键字,这时就可以在实例方法中修改值了,任何值的修改都会反映到原结构体或枚举的属性里。方法还可以给隐含的self属性分配一个新的实例。当这个方法结束的时候这个新分配的实例将会替换掉原有的实例。

struct Point {
    var x = 0.0, y = 0.0
    /* 添加 mutating 关键字
       在结构体的实例方法里修改值 */
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// 输出:The point is now at (3.0, 4.0)

1.3 Assigning to self Within a Mutating Method (在可变方法中给self分配值)

因为结构体的可变方法里面有一个隐含的self属性,所以我们可以给这个self属性重新分配一个新的实例(带有值)

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
    	/* 可变方法中对self属性操作也就是
    	   x += deltaX
    	   y += deltaY  
    	   的一个变种写法 */
        self = Point(x: x + deltaX, y: y + deltaY)
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// 输出的结果和上例都是一样的

枚举中的可变方法也可以在self属性里面重新分配一个新的实例,可以将枚举中这个隐含的self设置为一个不同类型的枚举成员,用来和其他成员做区分,

enum TriStateSwitch {
    case off, low, high
    mutating func next() {
    	// 按顺序切换下面某个成员本身
        switch self {
        case .off:
            self = .low
        case .low:
            self = .high
        case .high:
            self = .off
        }
    }
}
// 三态开关会按照low-high-off顺序来切换。
var ovenLight = TriStateSwitch.low // 初始处于low
ovenLight.next() // 由low切换到high
ovenLight.next() // 由high切换到off

猜你喜欢

转载自blog.csdn.net/weixin_45026183/article/details/105375569
今日推荐