版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.07.29 |
前言
我是swift2.0的时候开始接触的,记得那时候还不是很稳定,公司的项目也都是用oc做的,并不对swift很重视,我自己学了一段时间,到现在swift3.0+已经出来了,自己平时也不写,忘记的也差不多了,正好项目这段时间已经上线了,不是很忙,我就可以每天总结一点了,希望对自己对大家有所帮助。在总结的时候我会对比oc进行说明,有代码的我会给出相关比对代码。
1. swift简单总结(一)—— 数据简单值和类型转换
2. swift简单总结(二)—— 简单值和控制流
3. swift简单总结(三)—— 循环控制和函数
4. swift简单总结(四)—— 函数和类
5. swift简单总结(五)—— 枚举和结构体
6. swift简单总结(六)—— 协议扩展与泛型
7. swift简单总结(七)—— 数据类型
8. swift简单总结(八)—— 别名、布尔值与元组
9. swift简单总结(九)—— 可选值和断言
10. swift简单总结(十)—— 运算符
11. swift简单总结(十一)—— 字符串和字符
12. swift简单总结(十二)—— 集合类型之数组
13. swift简单总结(十三)—— 集合类型之字典
14. swift简单总结(十四)—— 控制流
15. swift简单总结(十五)—— 控制转移语句
16. swift简单总结(十六)—— 函数
17. swift简单总结(十七)—— 闭包(Closures)
18. swift简单总结(十八)—— 枚举
19. swift简单总结(十九)—— 类和结构体
20. swift简单总结(二十)—— 属性
21. swift简单总结(二十一)—— 方法
22. swift简单总结(二十二)—— 下标脚本
继承
继承是面向对象编程的特点,OC
中也有继承,swift
同样也有继承。类可以调用和访问超类的方法,属性和下标脚本,并可重写override
这些方法。可以为类中继承来的属性添加属性观察器(property observer)
,这样一来,当属性值改变时,类就会被通知到,可以为任何属性添加属性观察器。
下面我们就从以下几个方面阐述继承。
- 定义一个基类
(Base class)
- 子类生成
(Subclassing)
- 重写
(Overriding)
- 防止重写
定义一个基类
不继承其他类的类,称为基类。在swift
中的类并不是从一个通用的基类继承而来,如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。
看下面代码
class Vehicle{
var currentSpeed = 0.0
var description : String{
}
func makeNoise(){
}
}
这里,Vehicle
就成为了一个基类。
子类生成
子类生成指的是在一个已有类的基础上创建一个新的类,子类继承超类的特性,并且可以优化或改变它,你还可以为子类添加新的特性。
在定义的时候,将超类名写在子类名的后面,用冒号分割。
class Bicycle : Vehicle{
var hasBasket = false
}
和OC
一样,子类还可以被其他类继承,并继承其属性、方法等其他方面。
重写
子类可以为继承来的实例方法、类方法、实力属性、或下标脚本提供自己定制的实现,我们把这个叫做重写。重写的时候就在前面加上override
关键字。比较经典的就是swift
实例化控制器以后,如下代码。
override func viewDidLoad()
{
super.viewDidLoad()
}
这个是控制器实例的时候,就有重写override
这个方法。
1. 访问超类的方法、属性和下标脚本
当你的子类中重写超类的方法、属性或者下标脚本时,有时你的重写版本中使用已经存在的超类实现会大有裨益。
在合适的地方,你可以通过使用super
前缀来访问超类版本的方法、属性或下标版本。例如:
- 在方法
someMethod
的重写实现中,可以通过super. someMethod ()
来调用超类版本的someMethod
方法。
2. 重写方法
在子类中,你可以重写继承来的实例方法或类方法,提供一个定制或替代的方法实现。
下面看一下代码。
class Vehicle{
var currentSpeed = 0.0
var description : String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
print("nothing to do")
}
}
class Train: Vehicle {
override func makeNoise() {
print("train")
}
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
let train = Train()
train.makeNoise()
}
}
下面看一下输出结果
train
3. 重写属性
你可以重写继承来的实例属性和类属性,提供自己定制的setter
和getter
方法,或添加熟悉属性观察器使重写的属性观察值什么时候发生改变。
4. 重写属性的setter和getter方法
你可以提供定制的getter
和setter
来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的属性,子类并不知道继承来的属性是存储型的还是计算型的,它只是知道继承来的属性会有一个名字和类型,你在重写一个属性时,必须将它的名字和类型都写出来,这样编译器去检查你重写的属性是与超类中同名同类的属性相匹配的。
你可以将一个继承来的只读属性重写为一个读写属性,只需要你重写属性里的getter和setter方法,但是,你不可以将一个继承来的读写属性重写为一个只读属性。
注意:如果你在重写属性中提供了setter,那么你也一定要提供getter。如果你不想在重写版本中的getter里修改继承来的属性值,你可以直接通过super.someProperty
来返回继承来的值,其中someProperty
是你要重写的属性的名字。
class Vehicle{
var currentSpeed = 0.0
var description : String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
print("nothing to do")
}
}
class Car : Vehicle{
var gear = 1
override var description: String{
return super.description + "in gear \(gear)"
}
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.green
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car : \(car.description)")
}
}
下面看一下输出结果
Car : traveling at 25.0 miles per hourin gear 3
5. 重写属性观察器
你可以在属性重写中为一个继承来的属性添加属性观察器,这样一来,当继承类的属性值发生改变时,你就会被通知到。
注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器,这些属性是不可以设置的。还要注意不要同时提供重写的setter
和重写属性观察器,如果你想要观察属性值的变化,并且你已经为那个属性提供了定制的setter
,那么你在setter
中就可以观察到任何值变化了。
class AutomaticCar : Car{
override var currentSpeed: Double{
didSet{
gear = Int(currentSpeed / 10.0) + 1
}
}
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.green
let automaticCar = AutomaticCar()
automaticCar.currentSpeed = 35.0
print("automaticCar : \(automaticCar.description)")
}
}
下面看结果输出
automaticCar : traveling at 35.0 miles per hourin gear 4
防止重写
有的时候你不希望被重写,那么你可以通过把方法、属性或下标脚本标记为final
来防止它们被重写,只需要在声明关键字前加上@final
特性即可。
-final var
-final func
-final class func
-final subscript
同时你也可以在关键字class
前添加final
特性(final class)
来将整个类标记为final
的,这样的类是不可以继承的。
后记
未完,待续~~~