继承

类可以从另一个类继承方法、属性和其他特性,继承类称为子类,被继承类为其超类。Swift的类可以调用和访问超类的方法、属性和下标,并能重写这些版本以改进或修改其行为。

类还可以将属性观察器添加到继承的属性,属性观察器可以添加到任何属性。

定义基类

基类是不继承任何一个类的类。

注意

Swift类不会从通用基类继承,未指定超类的自定义类自动成为基类。

以下为一个自定义Vehicle基类:

class Vehicle {var currentSpeed = 0.0var description: String {return "traveling at \(currentSpeed) miles per hour"}func makeNoise() {// do nothing - an arbitrary vehicle doesn't necessarily make a noise}
}

使用初始化器语法创建一个类实例:

let someVehicle = Vehicle()

访问其description属性:

print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour

子类化

子类化是将一个新类置于现有类之上的行为,子类继承现有类的特性,也可以向子类添加新特性。

继承语法如下:

class SomeSubclass: SomeSuperclass {// subclass definition goes here
}

子类化Vehicle类:

class Bicycle: Vehicle {var hasBasket = false
}let bicycle = Bicycle()
bicycle.hasBasket = truebicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

子类继续子类化:

class Tandem: Bicycle {var currentNumberOfPassengers = 0
}let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
// Tandem: traveling at 22.0 miles per hour

重写

子类可以提供自定义的从超类继承来的实例方法、类型方法、实例属性、类型属性或下标,称为重写。

使用override关键字重写超类的特性,没有关键字的任何重写会导致编译错误。

访问超类方法、属性和下标

当子类重写方法、属性或下标时,可以将现有超类的实现用作重写的一部分,即在超类实现基础上重写。这时使用super前缀访问方法、属性或下标的超类版本:

  • 名为someMethod()的重写方法可以通过在重写方法实现中调用super.someMetho()来调用someMethod()的超类版本。

  • 被称为someProperty的被覆盖的属性可以在超级的gettersetter实现中以super.someProperty方式访问someProperty的超类版本。

  • someIndex的覆盖下标可以从覆盖的下标实现中访问与super [someIndex]相同的下标的超类版本。

方法重写

可以重写继承的实例或类型方法来提供子类中定制或替代方法的方法。

class Train: Vehicle {override func makeNoise() {print("Choo Choo")}
}let train = Train()
train.makeNoise()
// Prints "Choo Choo"

属性重写

可以重写继承的实例或类型属性,为该属性提供自定义gettersetter,或添加属性观察器以启用重写属性来观察底层属性值何时更改。

getter和setter属性重写

可以提供自定义的getter(和setter)来覆盖任何继承的属性,必须始终声明要覆盖的属性名和类型,以便编译器检查重写是否与具有同名同类型的超类属性匹配。

可以为超类的只读属性的重写同时提供gettersetter修改为读写属性,但不能将超类的读写属性重写为只读属性。

注意

当重写属性提供了setter时,还必须提供getter。若不想覆盖getter修改继承属性的值,可以从getter中返回super.someProperty以维持超类属性的getter实现。

以下为子类重写超类description属性并在超类实现基础上添加新功能:

class Car: Vehicle {var gear = 1override var description: String {return super.description + " in gear \(gear)"}
}let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// Car: traveling at 25.0 miles per hour in gear 3

属性观察器重写

重写属性会讲超类的属性观察器添加到继承的属性,不论该属性的实现方法如何都将能够在继承属性的值更改时收到通知。

注意

不能将属性观察器添加到继承的常量存储型属性或只读计算型属性,因为这些属性值不能更改。不能为同一属性同时提供重写的setter和重写的属性观察器,若要监听属性值的更改,并且已经提供重写的setter,则可以简单地监听重写的setter中任何值的更改。

class AutomaticCar: Car {override var currentSpeed: Double {didSet {gear = Int(currentSpeed / 10.0) + 1}}
}let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4

防止重写

通过将方法、属性或下标标记为final防止被子类重写,如final varfinal funcfinal class funfinal subscript

任何试图在子类中重写标记为final的方法、属性或下标都将报告编译错误,也可以在扩展中使用final关键字。

可以在类定义中的class关键字之前添加final修饰符防止该类被子类化,任何试图子类化标记为final的类都将报告编译错误。

转载于:https://www.cnblogs.com/keqipu/p/7627219.html

Swift教程之继承相关推荐

  1. Swift教程Swift语言快速入门(内部资料)

    Swift语言快速入门(内部资料) 试读下载地址:http://pan.baidu.com/s/1eQCGRHw 前言Swift教程Swift语言快速入门(内部资料)Swift教程Swift语言快速入 ...

  2. 中文版 Apple 官方 Swift 教程《The Swift Programming Language》

    简介 欢迎使用 Swift 关于 Swift 版本兼容性 Swift 初见 Swift 版本历史记录 Swift 教程 基础部分 基本运算符 字符串和字符 集合类型 控制流 函数 闭包 枚举 类和结构 ...

  3. iOS 8 Metal Swift教程 :开始学习

    (via:泰然网,译者:Hero Kingsley) 学习使用苹果GPU加速3D绘图的新API:Metal! 在iOS 8里,苹果发布了一个新的接口叫做Metal,它是一个支持GPU加速3D绘图的AP ...

  4. 【note】the swift programming language Swift教程笔记

    // ------–Swift教程--------------- 要么变量初始化让其可以推断出类型,要么直接指定一个类型,不可以写: var a 这样的语句,会让系统不明白a到底是什么类型的变量 允许 ...

  5. Swift教程之类和结构体

    类和结构体 可以通过使用常量.变量和函数完全相同的语法来定义属性和方法向类和结构添加功能. Swift不需要为自定义类和结构创建单独的接口和实现文件,只需要在单个文件中定义一个类或结构体Swift会自 ...

  6. swift 学习- 14 -- 继承

    // 一个类可以继承另一个 类的方法, 属性和其他特征, 当一个类继承其他类时, 继承类叫子类, 被继承类叫父类 或 (超类), 在 Swift 中, 继承是区分 [类] 和其他类型的 一个基本特征 ...

  7. swift 笔记 (十三) —— 继承

    继承 一个类能够从其他类继承方法.属性以及一些特征. 被继承的类叫父类,那还有一种就是子类了..这个我们都懂的. . 这是一个官方给的样例.它是一个基类(Base Class),由于它没有继承不论什么 ...

  8. Swift教程-视频拍摄教程

    原文链接:Take Video Tutorial in iOS8 with Swift 原文日期:2015/07/09 译者:lfb_CD 校对:numbbbbb 定稿:shanks 苹果公司提供了U ...

  9. 游戏中的三角学——Sprite Kit 和 Swift 教程(1)

    原文链接 : Trigonometry for Games – Sprite Kit and Swift Tutorial: Part 1/2 原文作者 : Nick Lockwood 译文出自 : ...

最新文章

  1. Insert Interval
  2. 功能超级丰富的彩色贪吃蛇,有道具,有等级!
  3. [实战]HM-Router configuration for TP ROOM
  4. c# 类的基本知识,未完,待续
  5. python中的scale_Python Matplotlib.pyplot.yscale()用法及代码示例
  6. 2025 年全球数据量高达175ZB,开发者如何挑战数据洪流?
  7. 如何面试一位前端工程师
  8. 通信原理-通信系统的组成
  9. scratch制作彩虹猫病毒模拟器
  10. 超全地牢场景unity3d模型素材网站整理
  11. 计算机enter代表什么意思,enter是什么意思
  12. 儒家学派有哪些代表人物?
  13. 地图白话(六):街景地图
  14. Proteus做C51最小系统的仿真
  15. 猫和老鼠:博弈论——记忆化搜索
  16. Mel中级教程精华篇预告
  17. 【转载】使用theano进行深度学习实践(一) - CSDN博客
  18. SHA-3标准(NIST.FIPS.202)阅读笔记
  19. 抖音小店商品卡访客七天新增1w+ 2023无货源起店方法,重点必看
  20. windows常用命令行操作及相关快捷方式

热门文章

  1. IE8“开发人员工具”(下)
  2. 蓝桥杯第六届省赛JAVA真题----生命之树
  3. js+获取当前域名及跳转、下载操作
  4. 新版的sublime text 3无法设为默认启动程序
  5. 关于eclipse web项目认不到用户库的问题
  6. python入门心得_一天入门 Python 的一些心得
  7. python 扫描仪_玩《Minecraft我的世界》学python编程,可领|取电子学习版本
  8. linux rt 应用程序,RTlinux编程
  9. 如何提高linux的时钟精度,Linux时钟精度提高有什么办法?
  10. php什么是变量6,PHP变量是什么