Swift 学习笔记 (继承)
一个类可以从另一个类继承方法、属性和其他的特性。当一个类从另一个类继承的时候,继承的类就是所谓的子类,而这个类继承的类被称为父类。
在 Swift 中类可以调用和访问属于它们父类的方法、属性和下标脚本,并且可以提供它们自己重写的方法,属性和下标脚本来定义或修改它们的行为。Swift 会通过检查重写定义都有一个与之匹配的父类定义来确保你的重写是正确的。
类也可以向继承的属性添加属性观察器,以便在属性的值改变时得到通知。可以添加任何属性监视到属性中,不管它是被定义为存储还是计算属性。
定义一个基类
任何不从另一个类继承的类都是基类。在Swift中不会从一个通用的基类继承,这一点与OC不同。你没有指定父类的类都会以基类的形式创建。
class Vehicle {
var currentSpeed = 0.0
var description:String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do someThing
}
}
//根据类初始化一个类的实例 并调用实例方法
let someVehicle = Vehicle()
someVehicle.description
子类
子类是基于现有类创建新类的行为。子类从现有的类继承了一些特征,你可以重新定义它们。你也可以为子类添加新的特征。
//创建一个继承与Vehicle的子类 Bicycle
class Bicycle:Vehicle {
//子类扩展的属性
var hasBasket = false
} var bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.00
bicycle.description
子类本身也是可以被继承的。
class Tandem:Bicycle {
var currentNumberOfPassengers =
}
let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers =
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
重写
子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写。
要重写而不是继承一个特征,你需要在你的重写定义前面加上 override 关键字。这样做说明你打算提供一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误。
override 关键字会执行 Swift 编译器检查你重写的类的父类(或者父类的父类)是否有与之匹配的声明来供你重写。这个检查确保你重写的定义是正确的。
class Train:Vehicle {
override func makeNoise() {
print("choo choo")
}
}
如果你创建了一个新的 Train 实例并且调用它的 makeNoise() 方法,你可以看到 Train 子类版本的方法被调用了:
let train = Train()
train.makeNoise()
重写属性的GETTER和SETTER
class Car:Vehicle {
var gear =
override var description: String {
return super.description + "in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear =
// Car: traveling at 25.0 miles per hour in gear 3
print("Car: \(car.description)")
重写属性观察器
你可以使用属性重写来为继承的属性添加属性观察器。这就可以让你在继承属性的值改变时得到通知,无论这个属性最初如何实现。
class AutoMaticCar:Car {
override var currentSpeed: Double{
didSet {
gear = Int(currentSpeed / 10.0) +
}
}
}
let automatic = AutoMaticCar()
automatic.currentSpeed = 120.0
print("AutomaticCar: \(automatic.description)")
阻止重写
你可以通过标记为终点来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写 final 修饰符(比如 final var , final func , final class func , fianl subscript )。
你可以通过在类定义中在 class 关键字前面写 final 修饰符( final class )标记一整个类为终点。任何想要从终点类创建子类的行为都会被报告一个编译时错误。
任何在子类里重写终点方法、属性或下标脚本的尝试都会被报告为编译时错误。你在扩展中添加到类的方法、属性或下标脚本也可以在扩展的定义里被标记为终点。
Swift 学习笔记 (继承)的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- swift学习笔记之-继承
//继承 import UIKit /* 继承(Inheritance): 1.一个类可以继承(inherit)另一个类的方法(methods).属性(properties)和其它特性.当一个类继承其 ...
- swift学习笔记(四)关于类的继承
在swift中,继承是区分类与其它对象的基本特征 继承后的子类能够重写父类的方法,包含类方法和实例方法,属性和附属脚本(subscript) 在继承过程中,构造器方法init()是不被继承的,须要显示 ...
- swift学习笔记4——扩展、协议
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- 记录:swift学习笔记1-2
swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- Aizu 2304 Reverse Roads
原题链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2304 题意: 给你一个网络,其中每条边的容量是1,你可以通过调整边的方向 ...
- Java NIO中的FileLock(文件锁)
FileLock,文件锁. 文件锁在OS中很常见,如果多个程序同时访问.修改同一个文件,很容易因为文件数据不同步而出现问题.给文件加一个锁,同一时间,只能有一个程序修改此文件,或者程序都只能读此文件, ...
- Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别
一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...
- 性能调优培训 windbg --woodytu
http://www.cnblogs.com/woodytu/p/4675479.html http://www.cnblogs.com/fjicn/p/3405716.html http://www ...
- Timeout watchdog using a standby thread
http://codereview.stackexchange.com/questions/84697/timeout-watchdog-using-a-standby-thread he simpl ...
- ios与js交互获取webview元素和赋值
使用webview的stringByEvaluatingJavaScriptFromString的方法交互,直接提供实例. 下载:http://download.csdn.net/detail/hey ...
- 列表pagesize修改每页显示的数量失效
◇系统错误修复工具 >> 检测微表正确性 原因是删除一些数据导致记录与实际数据不符 转自:http://bbs.dedecms.com/269491.html
- curl的用法
1.官网:https://curl.haxx.se/ 2.版本安全漏洞:https://curl.haxx.se/docs/security.html 3.github:https://github. ...
- HTML5 Canvas 绘制新西兰国旗
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- UNP学习笔记(第十六章 非阻塞I/O)
套接字的默认状态时阻塞的 可能阻塞的套接字调用可分为以下4类: 1.输入操作,包括read.readv.recv.recvfrom和recvmsg. 2.输入操作,包括write.writev.sen ...