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.png02.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.png07.png
- 只能重写var属性,不能重写let属性;
- 重写时,属性名,类型要一致;
- 子类重写后的属性权限,不能小于父类的属性权限;
- 如果父类属性是只读的,那么子类重写后的属性可以是只读的,也可以是读写的;
- 如果父类属性是可读写的,那么子类重写后的属性也必须是可读写的。
3.重写类型属性
- 被
class
修饰的计算类型属性,可以
被子类重写;- 被
static
修饰的类型属性(存储,计算),不可以
被子类重写。
09.png
END.
作者:翀鹰精灵
原文链接:https://www.jianshu.com/p/e339030feadf