学习Swift -- 继承
继承
一个类可以继承另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫子类,被继承类叫超类(父类)。
在 Swift 中,子类可以调用和访问父类的方法,属性和下标脚本(subscripts),并且可以重写(override)这些方法、属性和下标脚本来优化或修改它们的行为。Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写行为是正确的。
可以为子类中继承来的属性添加属性观察器(property observers),这样一来,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(stored property)还是计算型属性(computed property)。
子类生成
class Vehicle{ // 当一个类不继承任何类 默认为基类
var currentSpeed = 0.0
var discription: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do something
}
}
// 上面的代码生成了一个交通工具的基类 下面来生成子类 class Bicycle: Vehicle { // 冒号后跟随父类的名字就可以继承父类
var hasBasket = false
} // 先看下父类
let someVehicle = Vehicle()
someVehicle.currentSpeed = 15.0
print("someVehicle: \(someVehicle.discription)")
// 打印出 : "someVehicle: traveling at 15.0 miles per hour\n" // 再看下子类
let someBicycle = Bicycle()
someBicycle.currentSpeed = 20.0
someBicycle.hasBasket = true
print("someBicycle: \(someBicycle.discription)")
// 打印出 : "someBicycle: traveling at 20.0 miles per hour\n"
// 子类除了自己的属性外 还可以调用父类的属性和方法 这些就是继承的特性
重写
子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)
重写方法
class Train: Vehicle {
// 要想重写父类的特性时 在func前必须加上 override
override func makeNoise() {
print("ku ku ku ku ku...")
}
} let train = Train()
train.makeNoise()
重写属性
注意:子类可以将父类的只读属性重写为读写属性,但是绝对不可以将父类的读写属性重写为只读属性。
class Car: Vehicle {
var gear = 1
// 在基类中 discription是只读属性 但是在子类中可以重写这个属性并且增加setter方法
override var discription: String{
set {
print(newValue)
} get {
return super.discription + "in the gear: \(gear)"
// super代表基类的意思 调用 super.discription 会返回一个字符串 然后将这个字符串拼接一些你想要的东西后 作为get返回
}
}
}
重写属性观察器
注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSet
或didSet
实现是不恰当。此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
// 重写了currentSpeed 添加了属性观察期,这样当currentSpeed被赋值后可以做一些你想做的事情
}
}
重写下标脚本
因为重写下标脚本与重写属性类似,所以就不多做介绍了
class someClass{
subscript(index: Int) -> Int {
set { } get {
return 0
}
}
} class subClass: someClass {
override subscript(index: Int) -> Int {
set {
print(newValue)
} get {
return 100
}
}
}
防止重写
如果你声明了一个类,并且这个类有一些特性不想被重写,可以使用final关键字来防止重写
class Car: Vehicle {
final var gear = 1
final func brake(){
gear = 0
currentSpeed = 0.0
}
// 加上final关键字 如果有类继承这个类 也不会成功重写这些特性
}
学习Swift -- 继承的更多相关文章
- ios -- 教你如何轻松学习Swift语法(三) 完结篇
前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.自动引用计数 1.自动引用计数工作机制 1.1 swift和o ...
- ios -- 教你如何轻松学习Swift语法(二)
前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.可选类型(重点内容) 1.什么是可选类型? 1.1在OC开 ...
- ios -- 教你如何轻松学习Swift语法(一)
目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类 ...
- 一步一步学习Swift之(一):关于swift与开发环境配置
一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Sw ...
- 開始学习swift开发
近期要開始学习swift开发了,接下来的日子,会记录学习swift的历程.
- Java学习笔记---继承和super的用法
自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...
- 学习swift语言的快速入门教程推荐
随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...
- Exception类的学习与继承总结
日期:2018.11.11 星期日 博客期:023 Exception类的学习与继承总结 说起来我们上课还是说过的!老师提到了报错问题出现主要分Exception和Error两类!第一次遇见这个问题是 ...
- 一步一步学习Swift之(二):好玩的工具playground与swfit基础语法
playground好于在于能一边写代码一边看到输出的常量变量的值.不需要运行模拟器. 我们来试一下该工具的用法. 打开xcode6开发工具,选择Get started with a playgrou ...
随机推荐
- Java反射_JDBC操作数据
</pre><p>使用反射 来操作 这里是练习反射的使用</p><p>链接数据库工具类</p><p><pre name= ...
- jquerymobile-可折叠内容(Collapsible content)
可能我们在开发中遇到过这样的问题,我们只是看到一个题目或者简单的介绍,然后一点击会在下面展开对应的详细的内容.在jqm中实现这个效果很简单.下面给出一段例子代码: <!DOCTYPE html& ...
- C# 可访问一致性不一致
出现原因,其中一个是返回参数的访问级别小于函数的访问级别, 也就是说当定义一个返回参数的方法的时候,如果返回参数的访问级别低于方法的访问级别就会出现这样的错误,这个是可以理解的,如果返回的参数不能被访 ...
- TREEVIEW拖拽对应修改目录
附件:http://files.cnblogs.com/xe2011/TreeView_Drag_Directory%E6%93%8D%E4%BD%9C.rar TREEVIEW拖拽对应修改目 ...
- 数据库修复工具 - DatabaseCompressor 之从9M到900K+
数据库修复工具 - 仅限 *.mdb 格式的Access 数据库 引言: Access数据库操作有一严重Bug,当数据库文件内容添加�时,其文件容量随之添加�,但当删除数据库内容时,其数据库容量不会对 ...
- mybatis15 mapper方式 代码
UserMapper.java package cn.itcast.mybatis.mapper; import java.util.List; import cn.itcast.mybatis.po ...
- struts2标签汇总
要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码:<%@taglib prefix="s" uri="/struts- ...
- session的固化(搁置)
Session在其生命周期中,可能会在运行时状态和持久化状态之间转换. 会话从运行时状态变为持久化状态的过程称为 -- 搁置:在以下情况下,Session会被搁置: 当服务器总之或单个Web应用终止时 ...
- microchip PIC芯片使用方法
pickit3调试器使用: http://www.eeboard.com/evaluation/pickit3debug/1/ MPLAB环境使用: 1.代码折叠功能 2.代码补全功能 3.函数跳转功 ...
- VS2010调试多进程--医疗His调试中使用
有些时候碰到自己开发的程序嵌入到别人的框架中,而在接口的地方出了问题,而又不方便将自己的模快加入到别人的工程中这个时候VS的附加到进程调试变得不可或缺了,直奔主题 http://msdn.micros ...