Swift—继承
一个类可以继承另一个类的方法,属性和其他特性。当一个类继承其他类时,继承类叫子类,被继承类叫超类(或父类)。在Swift中,继承具有单继承的特点,每个子类只有一个直接父类,继承是区分类与其他类型的一个基本特征。
在Swift中,类可以调用和访问父类的方法,属性和下标脚本,并且可以重写这些方法,属性和下标脚本来优化或修改他们的行为。Swift会检查你的重写定义在父类中是否有匹配的定义,以此确保你的重写行为是正确的。可以为类中继承来的属性添加属性观察器,这样,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原来被定义为存储型属性还是计算型属性。
1.定义一个基类
不继承于其他类的类,称之为基类。(Swift中的类并不是从一个通用的基类继承而来。如果你不为你定义的类指定一个超类的话,这个类就自动成为基类。)
class Fruit {
var weight = 0.0
func info() {
print("我是一个水果,重\(weight)")
}
}
var f = Fruit()
f.info() //我是一个水果,重0.0
2.子类生成
子类生成指的是在一个已有类的基础上创建一个新的类。子类继承父类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:
class SomeClass: SomeSuperClass {
//类的定义
}
定义一个Apple类,继承Fruit
class Apple: Fruit {
var name : String!
func taste() {
print("\(name) taste good")
}
}
var a = Apple()
a.weight = 3.2
a.name = "黄香蕉"
a.info() //我是一个水果,重3.2
a.taste() //黄香蕉 taste good
3.重写
子类可以为继承来的实例方法,类方法,实例属性或下标脚本提供自己的实现,这种行为叫重写。当子类重写父类的方法时,要使用override修饰。
当子类重写了父类的方法,属性或下标脚本,子类将无法访问父类中被覆盖的内容,此时你可以使用super前缀来访问父类版本的方法,属性和下标脚本。
3.1重写方法
Apple类重写了父类的info方法,并调用super.info,打印两次。
class Apple: Fruit {
var name : String!
func taste() {
print("\(name) taste good")
}
override func info() {
super.info()
print("\(name) weight is \(weight)")
}
}
var a = Apple()
a.weight = 3.2
a.name = "黄香蕉"
a.info() //我是一个水果,重3.2 黄香蕉 weight is 3.2
3.2重写属性
Swift允许提供定制的getter(或setter)来重写任意继承来的属性,无论继承来的属性是存储型的还是计算型的属性。子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性的名字和类型。因此你在重写一个属性时,必须将它的名字和属性都写出来。可以将一个继承来的只读属性重写为一个读写属性,但不能将一个继承来的读写属性重写为一个只读属性。
class Fruit {
var weight = 0.0
var description : String {
return "\(self.weight)"
}
}
class Apple: Fruit {
var name : String!
override var description: String {
return self.name + " weight is " + super.description
}
}
var a = Apple()
a.weight = 4.0
a.name = "黄香蕉"
print(a.description) // 黄香蕉 weight is 4.0
3.3重写属性观察者
不要为继承来的常量存储属性或继承来的只读计算型属性添加属性观察者,这些属性的值是不会发生任何改变的。
不要同时提供重写的setter和重写的属性观察器,如果你想观察属性值的变化,并且已经为那个属性提供了setter方法,那么你在setter中就可以观察到了。
class Fruit {
var weight = 0.0
}
class Apple: Fruit {
var name : String!
override var weight: Double {
didSet {
super.weight += 1
}
}
}
var a = Apple()
a.weight = 4.0
print(a.weight) //5.0
3.4重写下标
重写下标可以提供定制的getter和setter。重写下标时,可以将父类的只读下标改写为读写下标,但不能将父类的读写下标重写为只读下标。
3.5防止重写
final修饰符,可修饰类、属性、方法、下标。使用final修饰的类不能被继承,使用final修饰的方法、属性、下标脚本不能被重写。
Swift—继承的更多相关文章
- 学习Swift -- 继承
继承 一个类可以继承另一个类的方法(methods),属性(properties)和其它特性.当一个类继承其它类时,继承类叫子类,被继承类叫超类(父类). 在 Swift 中,子类可以调用和访问父类的 ...
- Swift: 继承
为了在属性值改变的时候获得通知,类可以为继承的属性添加属性观察者.属性观察者可以添加到任何属性上,不管这个属性原来是存储属性还是计算属性. Swift中的类没有一个统一的基类. 为了讲明白继承,我们先 ...
- Swift继承的用法
一个类可以继承另一个类的方法,属性和其它特性.当一个类继承其它类,继承类叫子类,被继承类叫超类(或父类).在Swift中,继承是区分「类」与其它类型的一个基本特征. 在Swift中,类可以调用和访问超 ...
- Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现.下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举.协议等相关知识的学习. 效果图如下: 组件代码:Score ...
- swift 继承和构造器
继承 class Vehicle { var numberOfWheels: Int var maxPassengers: Int func description() -> String { ...
- Swift继承
//声明一个基类 class vehicle { var maxPassenger : Int = 0 var manufacturer : String! func description() -& ...
- [IOS]swift自定义uicollectionviewcell
刚刚接触swift以及ios,不是很理解有的逻辑,导致某些问题.这里分享一下swift自定义uicollectionviewcell 首先我的viewcontroller不是直接继承uicollect ...
- Swift与Objective-C交互
在同一个工程中是可以同时使用Swift和OC的,但不可以同时出现在同一个文件中. OC调用Swift相关信息的方法 在***.m文件中导入工程名-Swift.h即可. 如工程名为ABC,则在需要使用S ...
- 移动开发语言Swift
苹果公布了全新的编程语言Swift,Swift继承了Objective-C语言特性,并从Python和Java Script中长处,使Swift更易读.未来swift编程语言的会特大广大的使用 Swi ...
随机推荐
- CVPR历年Best Papers
作者:我爱机器学习原文链接:CVPR历年Best Papers CVPR (Computer Vision)(2000-2016) 年份 标题 一作 一作单位 2016 Deep Residual L ...
- UILabel多种字体
UILabel *label = [[UILabel alloc] init]; label.text = @"UILabel多种字体"; UIFont *font = [UIFo ...
- CSS表达式
一直以来我们被教育说CSS Expression是个坏东西,很影响性能,应该禁止使用,但是如果仔细想想CSS表达式影响性能的原因,规避掉影响性能的写法,CSS表达式还是能给我们带来一些惊喜的.CSS表 ...
- Ftrl in tensorflow
reference :点击这里https://github.com/tensorflow/tensorflow/issues/3725 讲解 http://www.tuicool.com/articl ...
- java打jar包,引用其他.jar文件
大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIF ...
- c语言操作一维数组-3
C语言选择题#includemain(){double a[15],k;k=fun(a);} 则以下选项中错误的fun函数首部是 ( D)A.double fun(double a[15]) B.do ...
- CSS之transition过渡练习
代码: <!DOCTYPE html><html><head> <title>transition</title> <meta cha ...
- fatal error: 'XCTest/XCTest.h' file not found
这个报错在几个方面.第一,它导致XCTedt依赖您的应用程序.框架,它只是在Xcode中可用.第二,你使用绝对路径,这并不保证是相同的从Mac Mac(例如,如果你安装了多个版本的Xcode). 这里 ...
- 第3.3 案例2: 工作队列 job queue
第2个案例就是工作队列,典型的点对点的消息,一个Producer发送一个工作消息到队列去,具有Listener类的Consumer能够从工作队列中获得一个工作情况的消息,这个消息被这个消费者消费掉之后 ...
- AFN断点续传思路