《从零开始学Swift》学习笔记(Day 44)——重写属性
原创文章,欢迎转载。转载请注明:关东升的博客
重写实例属性
我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分,他们在具体实现也是不同的。
实例属性的重写一方面可以重写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)——重写属性的更多相关文章
- 关东升的《从零开始学Swift》即将出版
		
大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift> <从零开始学Swift>将在< ...
 - Swift学习笔记(一)搭配环境以及代码运行成功
		
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
 - 关东升的《从零开始学Swift》3月9日已经上架
		
大家一直期盼的<从零开始学Swift>于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发.全 ...
 - python之感知器-从零开始学深度学习
		
感知器-从零开始学深度学习 未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程. 我希望在学习过程中做到 ...
 - 【swift学习笔记】二.页面转跳数据回传
		
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
 - 从零开始学Java——个人笔记(持续更新中)
		
从零开始学Java 学习流程 第一阶段:建立编程思想 Java概述 变量 运算符 控制结构 数组.排序和查找 面向对象编程(基础) 面向对象编程(中级) 项目&学习以致用 编程之乐 第二阶段: ...
 - SQL反模式学习笔记6 支持可变属性【实体-属性-值】
		
目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...
 - SQL反模式学习笔记8 多列属性
		
目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...
 - Python3+Selenium3+webdriver学习笔记10(元素属性、页面源码)
		
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记10(元素属性.页面源码)'''from selenium i ...
 
随机推荐
- Eclipse user library位置
			
原因: 转自:http://happycoolyp.iteye.com/blog/1853135 user libraries的记录文件%eclipse_workspace%\.metadata\.p ...
 - n皇后问题[分支限界法]
			
问题: 如何能够在 n×n 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上. 分析: 我们可以用一串数字来表示问题 ...
 - LoadRunner测试Google Suggest
			
Google的搜索框是典型的AJAX应用,用户在输入关键字的同时,前端页面通过xmlhttp与后台服务器动态交互,根据用户输入的关键字查找匹配的内容,向用户提示建议的搜索项,也就是所谓的“google ...
 - utf8和utf-8的区别?
			
utf8和utf-8的区别? utf-8和utf8的区别? 今天再次区别 相信很多程序员刚开始也会有这样的疑惑,如题,我也是. 其实,他们可以这样来区分. 一.在php和html中设置编码,请 ...
 - 每日一个机器学习算法——LR(逻辑回归)
			
本系列文章用于汇集知识点,查漏补缺,面试找工作之用.数学公式较多,解释较少. 1.假设 2.sigmoid函数: 3.假设的含义: 4.性质: 5.找一个凸损失函数 6.可由最大似然估计推导出 单个样 ...
 - 【JAVA秒会技术之秒杀面试官】秒杀Java面试官——集合篇(一)
			
[JAVA秒会技术之秒杀面试官]秒杀Java面试官——集合篇(一) [JAVA秒会技术之秒杀面试官]JavaEE常见面试题(三) http://blog.csdn.net/qq296398300/ar ...
 - Log4net 根据日志类型输出日志
			
第一步:引入Log4net.dll 文件的引用 第二步:添加LogHelper类,代码如下 using System; using System.Collections.Generic; using ...
 - Hive学习 系列博客
			
原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...
 - nginx.conf 详细
			
##定义nginx运行的用户各用户组user nginx nginx; ##nginx进程数,建议设置与cpu核心数一致worker_processes 1; ##全局错误日志定义类型[ debug ...
 - java线程不安全类与写法
			
线程不安全类 1.为什么java里要同时提供stringbuilder和stringbuffer两种字符串拼接类 2.simpledateformate是线程不安全的类,如果把它作为全局变量会有线程安 ...