美文网首页
【Swift 3.1】11 - 方法 (Functions)

【Swift 3.1】11 - 方法 (Functions)

作者: Lebron_James | 来源:发表于2017-01-25 00:06 被阅读106次

    方法 (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)


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

    相关文章

      网友评论

          本文标题:【Swift 3.1】11 - 方法 (Functions)

          本文链接:https://www.haomeiwen.com/subject/hbrtittx.html