继承

一个类可以继承另一个类的方法(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. flash builder4.7安装git插件

    如果直接点击Help > Eclipse Marketplace,然后搜索Egit, 以这种方式安装是会失败的!!! 因为版本兼容的问题.依次点击Help > About Flash Bu ...

  2. GestureDetector封装手势检測上下滑动

    项目中须要检測ListView的上滑下滑隐藏顶部View控件,之前在网上也有非常多实现案例.在git上发现个封装非常不错的样例,记录下来. GestureDetector是一个手势检測类,内部有个Si ...

  3. hdu 1247 Hat’s Words(字典树)

    Hat's Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  4. cocos2dx游戏项目总结(持续更新)

    1.在一个layer里面,尽量只使用一种按钮类型.如MenuItem or CCControlButton.因为这两种按钮的优先级不同,在使用过程中会互相影响到事件触发的先后顺序. 2.细节的问题要一 ...

  5. C#绘制圆形时钟

    本文由作者参考部分案例后加以修改完成: 参考链接如下: http://blog.csdn.net/xuemoyao/article/details/8001113 http://wenku.baidu ...

  6. Linq分页

    /// <summary> /// Linq分页 /// </summary> ;//每页条数 ;//总条数 ;//当前第几页 public static string con ...

  7. MYSQL之高级查询

    PHP高级查询 分组查询.联合查询.连接查询.子查询 版权声明:本文为博主原创文章,未经博主允许不得转载.

  8. H TML5 之 (6)下雨效果

    在对HTML5进行研究之后,有了一点想法,思考出游戏其实感觉就是四个步骤 1.创建一个你需要的对象,赋予属性(一些影响方法的属性),方法(运动,叫....) 2.实例化这个对象,让它成为一个或者多个个 ...

  9. SQL多表查询中的分页,字段组合综合实例解析

    原文:http://www.jb51.net/article/28753.htm http://xuzhihong1987.blog.163.com/blog/static/2673158720098 ...

  10. 日志记录组件[Log4net]详细介绍

    转载:http://www.cnblogs.com/liwei6797/archive/2007/04/27/729679.html 因为工作中有要用到Log记录,找到一篇不错的文章,就转了过来. 一 ...