阅读 72

swift5基本语法-方法/重写

一、方法

Swift中枚举、结构体、类都可以定义实例方法、类型方法。

  • 实例方法(OC中的-减号方法) 通过实例调用
  • 类型方法(OC中的+加号方法) 通过类型调用,用static或者class关键词定义。
  • 实例方法实例:
class Person {
    static var age = 0
    init() {
        Person.age += 1
    }
    //这里的age 等同于self.age 或 Person.age ,因为实例方法中self代表实例.
    static func getAge() -> Int {age}
}

let p1 = Person()
let p2 = Person()
let p3 = Person()

print(Person.getAge()) //3
  • 类型方法实例:
class Point {
    var x = 0.0
    var y = 0.0
}
let p1 = Point()
p1.x = 10
p1.y = 10
print(p1.x,p1.y) //10,10

注意:我这里用的是【class】,如果用【struct】,需要通过【mutating】来修饰,因为结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改

struct Point2 {
    var x = 0.0
    var y = 0.0
    //mutating: 结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改
    mutating func moveBy(deltaX:Double, deltaY:Double) {
        x += deltaX
        y += deltaY
        // self = Point2(x: x+deltaX, y: y+deltaY)
    }
}

小技巧:

@discardableResult 主动忽略返回值

01.png
02.png

二、重写

1.重写类型方法
  • class修饰的类型方法,允许被子类重写;
  • static修饰的类型方法,不允许被子类重写。
class Animal {
   class  func speak() {
       print("Animal speak")
   }
}

class Cat: Animal {
   override class func speak() {
       print("override speak")
   }
}

03.png

问:父类用class修饰,子类用static重写可以么?
例子:

04.png

答:可以。因为不管是通过class还是static来修饰,都代表类型方法,本质是不变的,但是会影响自己的子类,自己的子类不可以再次重写了。如下图所示:

05.png
2.重写实例属性
  • 子类可以将父类的属性( 存储、计算 )重写为【计算属性】。

    08.png

  • 子类不可以将父类的属性重写为【存储属性】。

06.png
07.png
  • 只能重写var属性,不能重写let属性;
  • 重写时,属性名,类型要一致;
  • 子类重写后的属性权限,不能小于父类的属性权限;
  • 如果父类属性是只读的,那么子类重写后的属性可以是只读的,也可以是读写的;
  • 如果父类属性是可读写的,那么子类重写后的属性也必须是可读写的。
3.重写类型属性
  • class修饰的计算类型属性,可以被子类重写;
  • static修饰的类型属性(存储,计算),不可以被子类重写。
    09.png

END.

作者:翀鹰精灵

原文链接:https://www.jianshu.com/p/e339030feadf

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐