写在前面:

写点东西,就是想告诉自己,有时间其实你也在前进着,快慢不说,至少没停下吧!该有的都会有的。不瞎BB了,说主题,3.0 的多态和继承。

总觉得继承好像也没什么太多的可说的了,在项目中用到的还是挺多的,反倒。是多态,我也知道有这个特性,说实话自己也不知道该在哪里可以用的到。但很多东西你可能会用,但你也不知道为什么的时候,可能你才会感受到基础知识是有用的。

一:多态的概念:

相同类型的变量在调用同一个方法呈现出多种不同的行为特征,这就叫多态。先丢这里吧,看了下面的东西,再回过头来看这个概念,也许会眼前一亮。

Swift 引用变量有两个类型

一:  编译时的类型,编译时的类型是由声明变量时的类型决定的。

二:  运行时的类型,运行时的类型是有实际赋给该变量的实例决定的(要不太明白,往后看代码就OK了)。

其实说直接点,就是这两个类型不一致,就会出现多态。下面是一个完整的Swift文件,以便于大家看的更明白一点。

import UIKit

class ProfileViewController: UIViewController {

    override func viewDidLoad() {
super.viewDidLoad() let one:FatherClass = FatherClass()
one.iamfather()
one.myname() let two :Subclass = Subclass()
two.iamchilder()
two.myname() let three:FatherClass = Subclass()
// 这里初始化之后,其实就是一个子类的实例,完后把它赋给父类的变量,这里就叫向上转型.它是由系统自己完成的 three.iamfather()
three.myname()// my name is zhangxiaoxu 这是打印出来的内容,可以看到他是调用的Subclass类型的myname方法,这既是多态,编译的时候他表现的是FatherClass类型的方法,但是在运行的时候,它表现的是运行时候的方法。这就是多态,一个引用变量,调用同一个方法myname时,表现出多种形态就是多态。 // 这句代码编译的时候会出错的,three编译时是FatherClass类型的,
//three.iamchilder()
// Do any additional setup after loading the view. }
class FatherClass {
func iamfather () -> Void { print("i am father")
} func myname() -> Void { print("my name is zhangxu") }
} class Subclass: FatherClass { func iamchilder() -> Void{ print("i am childer") } // 你要重父类的方法的时候,你得在发放前面加上这个关键字。override 百度翻译覆盖的意思。英语差!!
override func myname() -> Void { print(" my name is zhangxiaoxu") } } override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
} /*
// MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/ }

二:is 和 as 运算符的使用

is 运算符:它一般用在强制转换类型之前,用于判断前面一个引用变量是否引用后面的类,或者其子类,实现类的实例。如果有,则返回 true 没有就返回 false,返回 true 也就能够强制转换,返回 false 也就意味着不能强制转换。

注意点:

is 运算符 前后的操作数要么前后编译时保持类型相同,要么是继承关系,不然会报错!

as 运算符: 就是我们OC 中的强制类型转换。还有一个 as? 运算符,这个前面说话过可选类型符号 ? (不理解可以翻我前面的博客) 看看下面代码。

        print(one is Subclass) //  false
//print(one is FatherClass) let obj1:NSObject = "Hello zhangxu"
let obj2:NSString = obj1 as! NSString
print(obj2)// print(obj1 as? NSString) // 打印: Optional(Hello zhangxu) let obj3:NSObject = 66666
// print(obj3 as! NSString) 转换失败 // 这样写就没有问题,加is判断!
if (obj3 is NSString) { print(obj3 as! NSString) }

里面代码有注释了一句:print(obj3  as! NSString) 转换失败  这里说一下,你这样子写,编译是不会有问题的,但运行就会出错。

obj3 是NSNumber 类型的,你要强制转换成NSString 类型的,两个之间是没有任何关联的,不能强制转换,就会导致错误!!

Swift 2.2 多态和强制转换的更多相关文章

  1. 使用 as 和 is 运算符安全地进行强制转换

    由于对象是多态的,因此基类类型的变量可以保存派生类型. 若要访问派生类型的方法,需要将值强制转换回该派生类型. 不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastEx ...

  2. C++下的强制转换类型

    一.static_cast static_cast,静态类型转换.   下面,我举几个例子,大家就能清楚了. int main(int argc, char const *argv[]) { char ...

  3. java多态和强制类型转换

    子类可以赋值给超类,称之为向上转型,这个是自动的. 超类不可以赋值给子类,这个是向下转型,需要我们手动实现. 赋值给超类的子类引用在运行期间将表现出不同的特性,这就是多态. 小类型    可转换为   ...

  4. C++类型强制转换<转>

    转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...

  5. 如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南)

    如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南) 由于对象是多态的,因此基类类型的变量可以保存派生类型.若要访问派生类型的方法,需要将值强制转换回该派生类型.不过,在这些情况下, ...

  6. 关于 C++ 中的强制转换 - 基础篇

    引言 假设有基类 A,包含了虚函数 func1,以及有派生类 B,继承于类 A,派生类 B 中实现了函数 func1.此时可以用 A 类型的指针指向 B 类型的对象,并用 A 类型的指针调用 B 类型 ...

  7. C++ 类型转换(C风格的强制转换):

    转https://www.cnblogs.com/Allen-rg/p/6999360.html C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型, ...

  8. JAVA将数字字符串强制转换成整型变量----求参数之和实验代码(附流程图)

    一.设计思想 先将参数个数输出,并利用循环结果将参数逐个输出,再将字符串强制转化成整型,利用循环结构相加求和 二.程序流程图 三.源程序代码 package demo; public class Co ...

  9. JS当心隐式的强制转换

    JavaScript对类型错误出奇的宽容 3 + true; // 4 null + 3; // 3 运算符+(加号)的重载 运算符+既重载了数字相加,又重载了字符串连接操作.具体是数字相加还是字符串 ...

随机推荐

  1. webstorm快捷键说明

    webstorm快捷键说明 Editing编辑相关快捷键 Ctrl + Space:Basic code completion (the name of any class, method or va ...

  2. LPC2478的SPI使用

    LPC2478的spi使用 LPC2748具有一个SPI控制器,可以当做SPI主机或者从机使用,有以下特性 其使用起来很方便,并且支持中断,使用的寄存器如下 基本上,使用起来就是设置控制为,CPOL ...

  3. linux获得目录下文件个数

    获得当前目录下文件个数赋值给变量panonum: panonum=$(ls -l |grep "^-" | wc -l) 获取指定目录下文件个数赋值给指定变量: panonum=$ ...

  4. 10天学会phpWeChat——第九天:数据库增、删、改、查(CRUD)操作

    数据库的操作(CRUD)是一个现代化计算机软件的核心,尤其针对web应用软件.虽然在前面的几讲里,我们针对数据库操作大致有了一些了解,但今天我们需要再次强化下. 除了新瓶装老酒,我们今天还引入一个新的 ...

  5. [转]tar 分包压缩与合并

    要将目录logs打包压缩并分割成多个1M的文件,可以用下面的命令:  tar cjf - logs/ |split -b 1m - logs.tar.bz2. 完成后会产生下列文件:  logs.ta ...

  6. struts2拦截器-自定义拦截器,放行某些方法(web.xml配置)

    一.web.xml配置 <filter> <filter-name>encodingFilter</filter-name> <filter-class> ...

  7. UWP_小说在线阅读器:功能要求与技术要求

    学了WP开发也有一年了,也没做过什么软件的.17年进发UWP,锻炼自己一下.做一个开源的小说阅读器吧. 既然开发一个软件.所以要设计一下吧. 功能要求: 可能要用到的技术,这个吗,这就是遇到问题在解决 ...

  8. 安装pybloomfiltermmap 遇到bug

    pybloomfiltermmap pip 安装 : sudo pip install pybloomfiltermmap I want to try one program which have m ...

  9. Bootstrap3写的红色警告框样式组件

    用的是BT3的类和fa的图标 <!DOCTYPE html><html><head lang="en">    <meta charset ...

  10. Jqgrid学习(转载)

    jqGrid API 全   JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做 ...