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学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- 浅谈.Net异步编程的前世今生----EAP篇
前言 在上一篇博文中,我们提到了APM模型实现异步编程的模式,通过使用APM模型,可以简化.Net中编写异步程序的方式,但APM模型本身依然存在一些缺点,如无法得知操作进度,不能取消异步操作等. 针对 ...
- ES6十大特性
本文主要针对ES6做一个简要介绍. 主要译自: http://webapplog.com/ES6/comment-page-1/.也许你还不知道ES6是什么, 实际上, 它是一种新的javascri ...
- 基于WPF系统框架设计(8)-PasswordBox传值到ViewMode
应用场景 我要做一个系统登录功能,需要传用户名和密码到ViewModel中,可是PasswordBox传值到ViewModel中好像跟TextBox等控件不一样.这里需要用到附加属性. 附加属性:一个 ...
- 手机端用来上传用户头像的代码canvas
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Beginning Auto Layout Tutorial in iOS 7: Part 2
Auto Layout to the rescue! 接下来就看看如何使用Auto Layout来实现这个效果. 首先移除viewWillLayoutSubviews方法,选择Main.storybo ...
- NetBeans菜单栏字体太小了
NetBeans菜单栏字体太小了,导致很难看 解决方法:在netbeans的快捷方式内加入"netbeans.exe" --fontsize 12参数.还可以通过配置NetBean ...
- DotnetBrowser入门教程-(3)启动与使用简单的WebSocket服务
websocket是个很好的通信协议,基本可以贯穿支持html5的所有设备.dotnetbrowser内置了对websocket服务端与客户端的支持.请看例子: 1.新建桌面项目,基于.net 4.0 ...
- 在Android上编译OSG[3.0.2 ] (转)
在Android上编译OSG[3.0.2 ] 分类:Android This file contents can be applied for version OpenSceneGraph(OSG ...
- 每天一个命令 ls
默认建立一个目录时初始硬连接数为2若该目录下有几个目录就会再增加几个连接数 ls -li 查看inode信息 ls -al 查看所有文件信息 ls -lR 查看目录下目录下的文件(递归显示目录下的文件 ...
- OSX:设置用户默认浏览器
近期我们遇到的情况是,须要统一设置用户的默认浏览器为Google Chrome.而系统默认的是Safari. 这个设置是系统Launch Services基于用户管理的. 意思就是说,即便是改动了系统 ...