Swift4 类与继承, 类型转换, 类型判断
创建: 2018/03/05
完成: 2018/03/07
更新: 2018/03/09 完善标题 [Swift4 类与继承, 类型转换] -> [Swift4 类与继承, 类型转换与判断]
补充指定final的属性/方法无法被子类重载
更新: 2018/03/30 修改标题 [Swift4 类与继承, 类型转换与判断] -> [Swift4 类与继承, 类型转换, 类型判断]
【任务表】TODO
| 类定义 | |||||||||||||||||||
| 类的概要 |
class 型名: 父类, 采用的协议 {
例 class NullClass: ClassNameAchievable, CustomStringConvertible {
● 只能继承一个父类 ● 顺序随意 ● 类的实例与闭包的实例是参照型 ● 没有全项目构造函数, 不定义构造函数则只有默认构造函数(必须索所有属性都有初始值) ● 改变自身属性的函数不需要mutating 类实例是参照型, 改变自身是指改变自身所指。let的不能改变自身所指 构造体是值型, 改变自身属性也是改变自身 |
||||||||||||||||||
| 类的继承 |
● 只能继承一个父类 ● 被继承的叫父类(super class), 继承的叫子类(sub class), 没有继承其他类的叫基类(base class) 注: C++里父类叫做基类(基底类)(base class) ● 不继承构造函数 继承属性(容纳型, 计算型), 方法, 索引subscript. 继承构造函数的特例: 没有指定构造函数 --> 继承父类所有构造函数 重写父类所有指定构造函数 --> 继承父类所有简易构造函数 详细搜本博文: 构造函数的继承 ● 重载父类的方法或属性加上override 适用于: 方法, 计算型属性, subscript 区分自身与父类的方法与实例: self, super protocol ClassNameAchievable {
|
||||||||||||||||||
| 动态结合与类型转换 |
动态结合: 运行时候判别类型进行条件分歧
|
||||||||||||||||||
| 类方法与类属性 |
|
||||||||||||||||||
| 继承与方法的呼出 |
所有方法内部对其他类内部方法的呼出都相当于self.方法名(参数) 类方法与实例方法都是 class A {
|
||||||||||||||||||
| 构造函数 | |||||||||||||||||||
| 指定初始函数和简易初始函数 |
init(参数) { //指定构造函数
● 指定构造函数(designated initializer): 仅靠来初始化的构造函数 基类的默认构造函数是指定构造函数 类不可用全项目构造函数(违反封装原则) 简易构造函数(convenience initializer): 呼出本类的其他构造函数再进行附加处理的构造函数 ● 子类必须含有至少一个指定构造函数(只呼出父类的某个指定构造函数, 不呼出本类的其他构造函数) ● 父类的指定构造函数改为简易构造函数的重载加override convenience, 关键词顺序不限 父类的简易构造函数的重载不要override, 因为不会被子类呼出 class Sample {
● 构造函数是否相同只看参数数量, 参数名(最外侧标签), 参数型 无视是否可失败 init(a: Int) {
|
||||||||||||||||||
| 初始化的步骤和规则 |
● (a)指定构造函数必须先初始化新增的属性才能呼出super.init(...) (b)指定构造函数不能在super.init(...)之前设定super里有的属性 init(参数) { //指定构造函数
● 简易构造函数必须先self.init(...), 也就是必须先呼出指定构造函数/呼出内部呼出指定构造函数的简易构造函数 因为指定构造函数运行完以前的设定会被更改 由此简易构造函数不能设定let量 convenience init(参数) { // 简易构造函数
● 所有属性初始化完成以前不能使用实例变量, 实例方法, 不能把self作为值来用 用的话写成更外层的函数(如全局函数)或写成静态方法/类方法 ● 不可生成指定构造函数和简易构造函数的合体构造函数 不可用条件分歧(if等)既有super.init(...) 呼出父类指定构造函数, 也有self.init(...) 呼出自身的其他构造函数 |
||||||||||||||||||
| 构造函数的继承 |
满足一下任意条件则继承一部分 ● 子类一个指定构造函数也没有 继承所有指定构造函数 -> 继承所有简易构造函数 -> 继承所有构造函数 ● 子类带有父类所有指定函数 (a) 和上面一样, 子类一个指定构造函数也没有。 (b) 子类重载了所有指定构造函数 继承所有简易构造函数 总结: 只新建简易构造函数则继承父类所有构造函数 没有指定构造函数 --> 继承父类所有构造函数 重写父类所有指定构造函数 --> 继承父类所有简易构造函数 |
||||||||||||||||||
| 可能会失败的构造函数 |
类, 构造体可以定义init?(...) { ... } ● 呼出父类的可失败构造函数的也变成可失败构造函数 因为失败时 return nil , 整个构造函数都结束 ● 构造函数是否相同只看参数数量, 参数名(最外侧标签), 参数型 无视是否可失败 init(a: Int) {
|
||||||||||||||||||
|
必须构造函数 required initializer |
所有子类都必须带的构造函数, 名字前加上required required init(...) {
● 重载不需要override, 因为所有子类都必须具有 ● 子类的该构造函数也必须加上required ● 多个关键词是顺序不限 required convenience init(...) { ... }
convenience required init(...) { ... } // 两者一样, 关键词顺序不限
|
||||||||||||||||||
| 排他性法则 |
同一个变量同时只接受一个可读写的接入 目的: 增加安全性 var sampleArray = [, , ] |
||||||||||||||||||
| 继承与子类的定义 | |||||||||||||||||||
| 属性的继承 |
class Sample1 {
可以以计算型属性来重载父类的计算型, 容纳型属性 ● 获取父类的属性 super.属性名 ● 容纳型属性是重载必须同时有get, set ● 计算型属性重载 只有get ---> { get }, { get set } 都可 {get set} ---> 必须{ get set} |
||||||||||||||||||
|
索引的继承 subscript |
class Sample1 {
● 获取父类的索引: super[索引] |
||||||||||||||||||
| 继承与属性监听 |
可以添加属性监听, 加override ● 可加在父类的容纳型属性与计算型属性里 只可读属性不可加监听 ● 同类内部同一个属性, { get set } { didSet willSet } 不可共存 ● 重载以后原监听不会失效。按从进到远顺序运行 |
||||||||||||||||||
| 不允许重载的设定 |
加上关键词finnal ● 可用于类, 类属型, 类方法 指定final的无法被继承, 指定final的属性/方法无法被重载 final class Sample { // 指定final的无法被继承
● 优点: 减少动态结合, 提高运行速度 缺点: 不好维护(不好扩张和继承) |
||||||||||||||||||
| 类与协议 |
类来实现协议时
|
||||||||||||||||||
| 为类定义准备的协议 |
● 只有类, 结构体, 枚举型可以采用协议 ● 只运行类采用的协议定义方法 protocol 协议名: class, 继承的协议 { // 协议名后加上class
|
||||||||||||||||||
| 类与型 | |||||||||||||||||||
|
类型转换运算符 cast operator |
|
||||||||||||||||||
| 分歧语法与类型转换 |
case let/var 变量名 as 型 ● 例 switch sample { // 子类放在上方
● if-let和if-case的例 if let v = obj as? Sample { // if-let, if-var
● case条件写的时候和switch里一样, 加上 = 测试对象 case (, ..<) = (x, y) |
||||||||||||||||||
| meta type和dynamic type |
● 协议.Protocol 获取协议的meta type(原型), 表示该协议自身meta type ● 协议作型时, 协议.Type 表示采用该协议的型 (协议内部不能有附属型 associatedtype , 不能有 Self ) 具体型为采用该协议的型 class Sample: CustomStringConvertible { ... }
|
||||||||||||||||||
| 继承与Self |
● Self只可用于class内部函数的返回型和protocol ● Self表示当前的类 |
||||||||||||||||||
| 协议与类的合成 |
typealias Sample = ClassAndTypeTest & CustomStringConvertible & Equatable 表示采用协议的类或其子类 类似于协议的合成 |
||||||||||||||||||
| 继承与类型推导 |
● 包含不同型元素的数组 AnyObject: 任何类的型 Any: 任何类的型与任何构造体 var array1: [AnyObject] = [ ClassA(), ClassB(), ClassC() ] var array2: [Any] = [ ClassA(), , "Hello" ] ● 获取时要自己类型转换, as/as?/as! ● AnyObject主要用于和Objc交换信息 |
||||||||||||||||||
| 继承Obejctive-C类 |
和正常继承一样 ● 除了可用继承类的功能, 还可用作为Obejctive-C类的功能 只是想要作为ObjC类来用的话继承NSObject |
||||||||||||||||||
| 释放时的处理 | |||||||||||||||||||
| 释放时的处理与析构函数 |
● 必要性 读写文件的变量释放前关闭文件等, 动态释放内存 |
||||||||||||||||||
| 析构函数的定义 |
deinit {
● 释放前自动呼出, 只呼出一次 ● 从最下层子类一层层往上呼出 没定义的地方跳过, 继续网上 ● 内部处理不限, 但不能妨碍释放(如把要释放的实例代入到全局变量等) |
||||||||||||||||||
| 析构函数的例 |
class DeinitSampleClass {
|
||||||||||||||||||
Swift4 类与继承, 类型转换, 类型判断的更多相关文章
- js对象类型判断工具
对象类型判断工具 /** *类功能:对象类型判断工具 **/ var TypeUtil = { /** *方法说明:是否是数组 **/ isArray: function (obj) {//是否是数组 ...
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
类型判断符号: C#:object a; if(a is int) { } 用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...
- java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0
java 继承使用关键字extends 继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...
- java面向对象类的继承~ 匿名类 ;多态特性;强制类型转换
类的继承 创建子类语法: 修饰符 class 子类名 extends 父类名{ } 匿名子类语法: 直接实例化,过程中通过匿名类 继承父类,在实例化过程中将子类匿名 <父类 ...
- c#中判断类是否继承于泛型基类
在c#中,有时候我们会编写类似这样的代码: public class a<T> { //具体类的实现 } public class b : a<string>{} 如果b继承a ...
- Java 中 父类变量访问子类方法 需要使用 类型转换 (instenceof)关键字 /类型判断/
通过数组元素访问方法的时候只能访问在 Animal中定义的方法,对 于 Tiger类和 Fish中定义的方法时却不能调用,例如语句 animal[2].swim();就是不正确的.当 需要访问这些 ...
- 类型和原生函数及类型转换(二:终结js类型判断)
typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...
- Go 类型转换与类型判断
目录 Go 类型转换与类型判断 1.类型转化 2.类型判断 Go 类型转换与类型判断 1.类型转化 T(a) : T 是目标类型 a 是源变量 package main import "fm ...
- asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件
public class BasePage:Page protected override void OnPreLoad(EventArgs e){ base.OnPreLoad(e); ...
随机推荐
- 一份关于webpack2和模块打包的新手指南(二)
插件 我们已经看到一个内置的webpack插件的例子,在npm run build脚本中调用的webpack -p命令就是使用webpack附带的UglifyJsPlugin插件以生产模式压缩打包文件 ...
- 关于MSSQL的decimal(numeric)、money、float的使用以及区别
decimal(numeric).money.float(real) 都是MSSQL中的浮点类型的数据类型. 按存储的范围进行排序 float(real) decimal(numeric) money ...
- firedac数据集的序列和还原
procedure TForm1.Button1Click(Sender: TObject);var stream, stream2: TMemoryStream; buf: TBytes;begin ...
- Oracle冷备和热备脚本
Oracle冷备和热备脚本 冷备脚本: set feedback off set heading off set verify off set trimspool off set echo off ...
- 【c++】面向对象程序设计之继承中的类作用域
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...
- mysql手记
myisam innoDB是mysql经常使用的存储引擎 MyISAM不支持事务.也不支持外键.但其訪问速度快.对事务完整性没有要求. InnoDB存储引擎提供了具有提交.回滚和崩溃恢复能力的事务安全 ...
- webpack-Module Resolution(模块解析)
模块解析(Module Resolution) resolver 是一个库(library),用于帮助找到模块的绝对路径.一个模块可以作为另一个模块的依赖模块,然后被后者引用,如下: import f ...
- shutdown abort模式丢失redo,使用隐含參数启库
shutdown abort模式 丢失redo log 无法open数据库 通过告警报错ORA-00354: corrupt redo log block header 从该错误能够看出当前日志的re ...
- Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)
转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...
- Apsara Clouder专项技能认证:实现调用API接口 (笔记)