继承

一个类可以继承另一个类的方法(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返回
}
}
}

重写属性观察器

注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSetdidSet实现是不恰当。此外还要注意,你不可以同时提供重写的 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 -- 继承的更多相关文章

  1. ios -- 教你如何轻松学习Swift语法(三) 完结篇

    前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦.      一.自动引用计数   1.自动引用计数工作机制      1.1 swift和o ...

  2. ios -- 教你如何轻松学习Swift语法(二)

    前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦.      一.可选类型(重点内容)   1.什么是可选类型?        1.1在OC开 ...

  3. ios -- 教你如何轻松学习Swift语法(一)

    目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类 ...

  4. 一步一步学习Swift之(一):关于swift与开发环境配置

    一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Sw ...

  5. 開始学习swift开发

    近期要開始学习swift开发了,接下来的日子,会记录学习swift的历程.

  6. Java学习笔记---继承和super的用法

    自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...

  7. 学习swift语言的快速入门教程推荐

    随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...

  8. Exception类的学习与继承总结

    日期:2018.11.11 星期日 博客期:023 Exception类的学习与继承总结 说起来我们上课还是说过的!老师提到了报错问题出现主要分Exception和Error两类!第一次遇见这个问题是 ...

  9. 一步一步学习Swift之(二):好玩的工具playground与swfit基础语法

    playground好于在于能一边写代码一边看到输出的常量变量的值.不需要运行模拟器. 我们来试一下该工具的用法. 打开xcode6开发工具,选择Get started with a playgrou ...

随机推荐

  1. 统计学习导论:基于R应用——第三章习题

    第三章习题 部分证明题未给出答案 1. 表3.4中,零假设是指三种形式的广告对TV的销量没什么影响.而电视广告和收音机广告的P值小说明,原假设是错的,也就是电视广告和收音机广告均对TV的销量有影响:报 ...

  2. JSP中嵌入java代码的标签方式(转)

    (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% java代码; %> (3)表达式 ...

  3. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  4. PYTHON queue

    http://blog.csdn.net/bravezhe/article/details/8588437

  5. pip安装 MySQLDb 和 Django

    wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa33326 ...

  6. C#中对于可变性的限制

    发现很少有集中讨论C#可变性限制的中文博文(要么就是一大段文字中夹杂很多凌乱的部分),所以写发篇博文,集中讨论,这些限制基本是基于安全考虑,亦或者根本难以实现而产生的. 注:本文不再解释什么是可变性, ...

  7. android开发之重写Application类

    在android应用开发中,重写Application也算是比较常见的,以前开发的一些程序太过于简单,都不要重写这个类,但是在真正的商业开发中,重写Application类几乎是必做的. 为什么要重写 ...

  8. Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

    最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面 ...

  9. ASP.NET+ashx+jQuery动态添加删除表格

    aspx: <script src="../script/jquery-1.4.4.min.js" type="text/javascript" lang ...

  10. JavaScript入门(2)

    一.JS输出内容--(document.write) document.write()可用于直接向HTML输出流写内容,即直接在网页中输出内容. 第一种:输出内容用" "括起来,直 ...