学习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返回
        }
    }
}

重写属性观察器

注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供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关键字 如果有类继承这个类 也不会成功重写这些特性
}
时间: 2024-10-19 11:36:33

学习Swift -- 继承的相关文章

Swift从零开始学习_07(UI界面实践中学习Swift)

昨天试了下写代码后感觉写比只是看好很多, 所以今天就又写了一点东西, 主要是类的属性.以及继承和xib等一些知识, 也遇到了很多麻烦, 不过好在都已经解决了, 这里简单写一下今天的代码, 有什么不对的地方了, 还是希望提出来. 先看一下做的第一个简单的页面:点击第二个按钮, 下面的视图变化颜色, 点击第一个按钮, 模态一个页面 首先是我们之前写OC代码时候在.h里面声明的一些属性, 在Swift怎么声明呢?,方法如下: var array:NSMutableArray = NSMutableAr

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

前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.可选类型(重点内容) 1.什么是可选类型? 1.1在OC开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型) 1.2在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语言) 1.3但是开发中赋值nil,在所难免.因此推出了可选类型 目的:让代码更加严谨 2.可选类型的取值 可选类型要么是:空值 , 要么

关于学习Swift的一些感受

最近准备开始学习Swift.之前计划的是一个月内要能写出一个简单的APP出来.毕竟我只有晚上下班了有点时间. 因为从网上看的或者听别人说的,都说如果会OC,Swift学习也就一两个星期的事情.然后我就当真了.. 然后,开始看了一个星期的官方文档,照着文档敲例子还行,敲玩就忘了..我以为是因为看的英文的原因. 然后,又开始拿中文翻译文档,准备从头开始看一遍,结果还是一样的,看了一半文档,发现前面的又忘了.. 不得不说我的记忆力确实太渣了. 今天周末,下定决心不看文档了,直接从github上找了几个

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

一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣. 4.Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,它的降临将重新定义软件开发. 5.Swift 是编写 iOS 和 OS X 应用的极佳手段,并将伴随着新的特性和功能持续演进.

Swift学习——Swift基础详解(四)

A:小儿编程很不好! B:多半是不爱学,从看英文版开始,让你爱上编程! Type Aliases    类型重定义(typedef) Swift中重定义类型的关键字是typealias,至于怎么用,应该不必多说了,看例子: typealias AudioSample = UInt16 //定义了一个类型名称AudioSample,代表UInt16类型 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0 Boo

如何学习Swift可空链式调用

今天我们一起来学习Swift可空链式调用.可空链式调用是一种可以请求和调用属性.方法以及下标的过程,它的可空体现在请求或调用的目标当前可能为nil.如果可空的目标有值,即调用就会成功:如果选择的目标为nil,即调用将返回nil.多个连续的调用可以被链接在一起形成一个调用链,如果其中任何一个节点为nil将导致整个链调用失败.    一.使用可空链式调用来强制展开    可空链的定义,即是在要调用非空的属性.方法.下标的可空值后面添加一个问号即可.特别的,可空链式调用的返回结果与原本的返回结果具有相

Swift学习——Swift基础详解(一)

注:由于基础部分在Swift Tour 中已经大体的说明了,所以在详解中不会达到100%的原文释义 Constants and Variables  常量和变量 常量和变量都需要声明名称和类型(作为程序员,这些基础也就不说了),常量一次赋值不能改变,变量的值可以改变 Declaring Constants and Variables   声明常量和变量 常量和变量在使用之前必须要声明,使用let关键字定义常量,var关键字定义变量 下面的例子可以用来定义用户登录的时候最大的尝试次数: let m

Swift学习——Swift基础详解(二)

上节说了没有营养的变量和常量,这玩意,都差不多,自己稍微看下就好了 Integers    整型 整数就是整数了,没有小数,整数有符号(+,-,0)或者无符号(0,+) Swift提供了8,16,32,64位的有符号和无符号的整数,命名使用C的方式,比如,8位无符号的整型UInt8,32位有符号的整型就是Int32 Integer Bounds    整型范围 可以使用min 和 max获取整数类型的最大值和最小值 let minValue = UInt8.min // minValue is

Swift学习——Swift基础详解(三)

小葵花课堂继续开讲 Numeric Literals    数字文本 数字文本有以下几种写法: A decimal number, with no prefix A binary number, with a 0b prefix An octal number, with a 0o prefix A hexadecimal number, with a 0x prefix 十进制数,无前缀:二进制数,0b前缀:八进制数,0o前缀:十六进制数,0x前缀 论数字17的N种表现形式: let deci