原创文章,欢迎转载。转载请注明:关东升的博客

重写实例属性

我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分,他们在具体实现也是不同的。

实例属性的重写一方面可以重写getter和setter访问器,另一方面可以重写属性观察者。

计算静态属性需要使用getter和setter访问器,而存储属性不需要。子类在继承父类后,也可以通过getter和setter访问器重写父类的存储属性和计算属性。

下面看一个示例:

class Person {
var name: String //存储属性
var age: Int //存储属性
func description() -> String {
return "\(name) 年龄是: \(age)"
}
init (name: String, age: Int) {
self.name = name
self.age = age
}
}
class Student: Person {
var school: String
override var age: Int { //重写属性前面要添加override关键字
get {
return super.age
}
set {
super.age = newValue < ? : newValue
}
} convenience init() {
self.init(name: "Tony", age: , school: "清华大学")
} init (name: String, age: Int, school: String) {
self.school = school
super.init(name: name, age: age)
}
} let student1 = Student()
print("学生年龄:\(student1.age)")
student1.age =
print("学生年龄:\(student1.age)")

从属性重写可见,子类本身并不存储数据,数据是存储在父类的存储属性中的。

以上示例是重写属性getter和setter访问器,我们还可以重写属性观察者,代码如下:

class Person {
var name: String
var age: Int func description() -> String {
return "\(name) 年龄是: \(age)"
} init (name: String, age: Int) {
self.name = name
self.age = age
}
} class Student: Person { var school: String override var age: Int { //重写了age属性观察者
willSet { //如果只关注修改之前的调用,可以只重写willSet观察者
print("学生年龄新值:\(newValue)") }
didSet{ //如果只关注修改之后的调用,可以只重写didSet观察者
print("学生年龄旧值:\(oldValue)")
}
} convenience init() {
self.init(name: "Tony", age: , school: "清华大学")
}
init (name: String, age: Int, school: String) {
self.school = school
super.init(name: name, age: age)
}
}
let student1 = Student()
print("学生年龄:\(student1.age)")
Student1.age =
print("学生年龄:\(student1.age)")

代码Student1.age = 6修改了age属性,修改前后的输出结果如下:

学生年龄新值:6

学生年龄旧值:18

重写静态属性

在类中静态属性定义使用class或static关键字,但是使用哪一个要看子类中是否重写该属性。class修饰的属性可以被重写,static关键字就不能被重写。

示例代码如下:

class Account {  

    var amount: Double = 0.0               // 账户金额
var owner: String = "" //账户名 var interestRate: Double = 0.0668 //利率 //class不能换成static
class var staticProp: Double { //静态属性staticProp
return 0.0668 * 1_000_000
} var instanceProp: Double {
return self.interestRate * self.amount
}
} class TermAccount: Account { //class换成static
override class var staticProp: Double { //重写静态属性staticProp
return 0.0700 * 1_000_000
}
} //访问静态属性
print(Account.staticProp)
print(TermAccount.staticProp)

由于要被重写所以代码class var staticProp: Double 中的class不能换成static。代码override class var staticProp: Double中的静态属性staticProp可以使用class或static,除非在TermAccount的子类中重写属性staticProp。

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
                          ​
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php

《从零开始学Swift》学习笔记(Day 44)——重写属性的更多相关文章

  1. 关东升的《从零开始学Swift》即将出版

    大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift> <从零开始学Swift>将在< ...

  2. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  3. 关东升的《从零开始学Swift》3月9日已经上架

    大家一直期盼的<从零开始学Swift>于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发.全 ...

  4. python之感知器-从零开始学深度学习

    感知器-从零开始学深度学习 未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程. 我希望在学习过程中做到 ...

  5. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  6. 从零开始学Java——个人笔记(持续更新中)

    从零开始学Java 学习流程 第一阶段:建立编程思想 Java概述 变量 运算符 控制结构 数组.排序和查找 面向对象编程(基础) 面向对象编程(中级) 项目&学习以致用 编程之乐 第二阶段: ...

  7. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

  8. SQL反模式学习笔记8 多列属性

    目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...

  9. Python3+Selenium3+webdriver学习笔记10(元素属性、页面源码)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记10(元素属性.页面源码)'''from selenium i ...

随机推荐

  1. react-native-storage + AsyncStorage 实现数据存储

    1.组件封装 import Storage from 'react-native-storage'; import { AsyncStorage } from 'react-native'; cons ...

  2. hdu1236 排名(结构体排序)

    排名 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  3. 【BIEE】18_时间序列函数的使用

    三个时间序列函数 AGO: 实现同环比 TO DATE:实现累计指标,如MTD月累计.YTD年累计 Period Rolling:当前时间的x个时间单位开始到y个时间单位结束这一时段内的度量总和 BI ...

  4. 非等高cell实战--实现微博页面

    代码地址如下:http://www.demodashi.com/demo/11639.html 前言 学习过UITableView.AutoLayout以及MVC的相关知识,接下来通过一个微博页面实战 ...

  5. C# 6.0语法糖剖析

    C# 6.0语法糖剖析 2016年12月16日 16:10:27 阅读数:586   版权声明:本文为博主http://www.feixueteam.net原创文章,未经博主允许不得转载. https ...

  6. where 泛型类型参数及约束

    private void InsertData<TRowMetadata, TFieldMetadata, TCellMetadata>(IMetadataReader<TRowMe ...

  7. node.js 学习03

    node.js学习03 解决浏览器接收服务端信息之后乱码的问题: 服务器通过设置http响应报文头,告诉浏览器使用相应的编码 来解析网页. res.setHeader('Content','text/ ...

  8. partial(类型)(C# 参考)

    通过分部类型可以定义要拆分到多个文件中的类.结构或接口. 如下: 在 File1.cs 中: namespace PC { partial class A { ; void MethodA() { } ...

  9. rabbitmqctl 报错

    RabbitMQ 安装成功后,cmd dos命令进入RabbitMQ的安装路径,如 E:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.10\sb ...

  10. windows下使用python2.7.6 安装django

    1) 安装python2.7.6 2) 由于 python2.7.6 中没有安装setuptools,需要先从官网下载setuptools,下载zip包然后解压,运行 python setup.py ...