天天看点

Swift实用小册12:Class类的继承

在本章中,你将学会​

​Class​

​类的继承的使用方法。

前言

和​

​Apple​

​​官网或者网上分享的教程类文章不同,我将以实际开发角度讲述​

​Swift​

​​语言的一些概念和用法,方便大家更好地学习和掌握​

​Swift​

​语言。

这同时也是对自己学习​

​Swift​

​语言过程的知识整理。

如有错误,以你为准。

继承的定义

在​

​Swift​

​编程中,我们常常会定义一个方法类,然后将一些常用的方法放在类中,然后在实际业务中进行调用。

我们定义好的初始的方法在调用时,可能需要对调用的类的参数或者方法进行重写或者加以补充,这时候我们就需要使用到继承关系。

继承,一个类获取另一个类的方法或属性。

在继承的概念中,和​

​JAVA​

​类似,初始定义的类通用叫做父类,然后我们在实际业务中调用初始定义的类,继承初始的类的参数或方法,这样继承的类叫做子类。

继承的使用

我们新建一个​

​PlayGround​

​​文件,命名为​

​SwiftInherit​

​。

首先,我们先定义一个父类,父类也可以叫做基类,也就是不继承其他类的类。

// 父类

class ViewModel {

    var appId: String = ""

    func gotoAppStore() {
        let urlPrex = "itms-apps"
        let appUrl = urlPrex + "://itunes.apple.com/app/id" + appId
        let appNsUrl = NSURL(string: appUrl)
        UIApplication.shared.open(appNsUrl! as URL, options: [:], completionHandler: nil)
    }
}      
Swift实用小册12:Class类的继承

上述代码中,我们定义了一个​

​ViewModel​

​​类,在类里,我们先声明了一个​

​String​

​​类型的​

​appId​

​​变量,并赋予了初始值。然后我们定义了一个​

​gotoAppStore​

​方法,这个方法之后我们会在子类中使用。

// 子类

class ToAppstore: ViewModel {
    override func gotoAppStore() {
        print("这里是子类继承的父类的方法")
    }
}      
Swift实用小册12:Class类的继承

上述代码中,我们在已有的​

​ViewModel​

​​类上创建一个新的类​

​ToAppstore​

​,用冒号的方法继承​

​ViewModel​

​类的属性和方法。

在​

​ToAppstore​

​​子类中又有一个​

​gotoAppStore​

​​方法,所以我们需要使用关键字​

​override​

​​来表示这个方法是父类的,且在子类中重写父类的方法​

​gotoAppStore​

​。

这样的方式,父类的方法是不需要改变,我们只需要根据业务调整子类的方法就可以减少很多工作量。

继承的其他使用

继承中还有两个场景用法需要注意,一个是有时候我们定义好的父类的参数和方法是不能更改时,子类不能继承,只能调用父类使用。

//父类的私有方法

class Person {
    final func fullName() {
        print("完整的名字")
    }
}      
Swift实用小册12:Class类的继承

上述代码中,我们定义了一个​

​Person​

​​类,类里面有一个使用关键字​

​final​

​​表明了不能被继承的方法​

​fullName​

​​。这样​

​Person​

​​类中的​

​fullName​

​方法是父类独有的方法,不能被子类继承。

上面的场景是私有方法的场景,在更上面我们使用​

​override​

​关键字,让子类可以继承父类定义的方法。

如果我们需要在子类继承和修改父类的属性改如何处理?

这就是我们要谈的第二个场景。

//父类

class Judgement{
    var isEnable:Bool {
        return true      

上述代码中我们定义了一个​

​Judgement​

​​类,类里面声明了一个​

​Bool​

​​类型的变量​

​isEnable​

​​,它返回值为​

​true​

​。

//子类重写属性

class Scene:Judgement {
    override var isEnable:Bool {
        return false      

上述代码中,我们基于​

​Judgement​

​​父类创建了一个​

​Scene​

​​子类,使用​

​override​

​​关键字继承重写​

​Judgement​

​​中​

​isEnable​

​​的属性,将​

​isEnable​

​​属性值改为了​

​false​

​。

另外值得注意的是,子类并不知道继承来的属性是存储属性的还是计算属性,它只知道继承来的属性会有一个名字和类型。

所以我们在重写一个属性时,必需将它的名字和类型都写出来。

Swift实用小册12:Class类的继承