【Swift 3.1】11 - 方法 (Functions)

2017-01-25  本文已影响106人  Lebron_James

方法 (Functions)

自从苹果2014年发布Swift,到现在已经两年多了,而Swift也来到了3.1版本。去年利用工作之余,共花了两个多月的时间把官方的Swift编程指南看完。现在整理一下笔记,回顾一下以前的知识。有需要的同学可以去看官方文档>>


类、结构和枚举都可以定义实例方法和类方法。与C和OC一个主要的不同点,就是Swift的结构和枚举能定义方法,而在OC中只有类才可以定义方法。

实例方法 (Instance Methods)

实例方法内部可以访问其他实例方法和属性。

class Counter {
    var count = 0
    func increment() {
        count += 1
    }
    func increment(by amount: Int) {
        count += amount
    }
    func reset() {
        count = 0
    }
}

使用点语法调用方法:

let counter = Counter()
// the initial counter value is 0
counter.increment()
// the counter's value is now 1
counter.increment(by: 5)
// the counter's value is now 6
counter.reset()
// the counter's value is now 0
self属性 (The self Property)

每一个类型的实例都有一个隐式的属性self,正好等于实例自己。在它自己的实例方法内部使用self来引用当前实例。

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

如果我们没有写self,Swift会认为你正在引用当前实例的属性或方法。当参数名和实例属性名一样时,我们必须明确写出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: 1.0) {
    print("This point is to the right of the line where x == 1.0")
}
// Prints "This point is to the right of the line where x == 1.0"
在实例方法内部修改值类型 (Modifying Value Types from Within Instance Methods)

结构和枚举都是值类型。默认情况下,值类型的属性在自己的实例方法内部是不能修改的。

然而,如果我们要在方法内部修改结构或者枚举的属性,我们可以为那个方法加上mutating行为。然后这个方法就能在方法内部修改自己的属性,当方法结束时,任何改变都会写回给最初的那个结构。这个方法还可以完全赋一个新的实例给self属性,然后这个新的实例会替换掉已经存在的实例。

使用mutating关键字来实现这个行为:

struct Point {
    var x = 0.0, y = 0.0
    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))")
// Prints "The point is now at (3.0, 4.0)"

注意:我们不能使用用一个结构的常量调用mutating方法,因为它的属性值是不能被改变的,即使是可变属性。

let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0)
// this will report an error
在Mutating方法内部给self赋值 (Assignto self Within a Mutating Method)
struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        self = Point(x: x + deltaX, y: y + deltaY)
    }
}

枚举类型的mutating方法:

enum TriStateSwitch {
    case off, low, high
    mutating func next() {
        switch self {
        case .off:
            self = .low
        case .low:
            self = .high
        case .high:
            self = .off
        }
    }
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
// ovenLight is now equal to .high
ovenLight.next()
// ovenLight is now equal to .off

类方法 (Type Methods)

使用static来定义类方法,class类型可以使用class关键字,以允许子类重写父类的实现。

注意:在OC中,我们只能在class中定义类方法。而在Swift,可以在类、结构和枚举中定义类方法。

class SomeClass {
    class func someTypeMethod() {
        // type method implementation goes here
    }
}
SomeClass.someTypeMethod()

在类方法的方法体中,隐式的self属性引用着类型自己,而不是这个类型的实例。


第十一部分完。下个部分:【Swift 3.1】12 - 下标 (Subscripts)


如果有错误的地方,欢迎指正!谢谢!

上一篇下一篇

猜你喜欢

热点阅读