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

重写实例属性

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

实例属性的重写一方面可以重写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. Android开发之Is Library篇

    一.生活场景描述 由于公司有一个项目开发的时间比较长,项目里堆砌的代码也比较多,并且有些功能在给不同客户发布的时候有些功能还不需要,这样功能模块分离就很有必要了. 所以,Library就被推到了前台, ...

  2. 帮朋友转发招聘信息 南京知名互联网公司招聘java、测试、前端,具体私聊

    一.java开发 1.5年及以上J2EE方向开发经验 2.精通spring等开源框架 3.熟悉html.javascript.css.jsp/freemarker.jquery的使用 4.熟悉使用my ...

  3. hibernate 悲观锁乐观锁

    悲观锁和乐观锁是:在事务隔离机制中设置了ReadCommited的情况下,两种可以避免不可重复读的方式.   设置成读已提交是考虑到安全和处理速度,保证并发效率,但是在这个情况下仍然需要避免不可重复读 ...

  4. wamp通过phpMyAdmin修改登录密码

    初始安装wamp后,默认mysql是没有密码的,这个时候如果想要修改密码,可以按照以下步骤进行: 第一.打开phpMyAdmin,看到界面如图所示: 第二.通过导航找到“用户”,再找到“编辑权限”进行 ...

  5. C# Soap调WebService

    public class WebServiceHelper { /// <summary> /// Soap协议Post方法 /// </summary> /// <pa ...

  6. 摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程

    摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程 根据虚拟驱动vivi的使用过程彻底分析摄像头驱动// 1~2都是在v4l2_open里调用1. open2. ioctl(4, ...

  7. ZooKeeper_基础知识学习

    ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookee ...

  8. java - day07 - PrimeNum

    判断质数 package day06; import java.util.Scanner; //验证质数 public class primeNum { public static void main ...

  9. 自定义 Collection View 布局

    自定义 Collection View 布局 answer-huang 29 Mar 2014 分享文章 UICollectionView 在 iOS6 中第一次被引入,也是 UIKit 视图类中的一 ...

  10. PHPWord使用方法

    官方文档  github地址 一.安装 直接使用composer安装,链接地址 composer require phpoffice/phpword 二.简单使用 require_once 'PhpO ...