Swift3.0 多态 继承 强制转换
Posted 蜗牛的脚印
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift3.0 多态 继承 强制转换相关的知识,希望对你有一定的参考价值。
又有点空开始瞎BB一下,写写博客了。这几天发现了一个现象,在博客园特别能吸粉的,只有两类人,一种大神 。一种 美女程序媛,看到大神呢,默默的粉一个,毕竟还是得好好学学人家的,看到美女程序媛呢,默默地多看两眼,从来也不粉,就这样静静的装着B,没办法,习惯了。。估计也有很多像我这样,有时间就写写的孩纸其实挺多的,有时候吧,粉不粉这种事,不能太认真。一你不是大神,二不是漂亮MM。写点东西,就是想告诉自己,有时间其实你也在前进着,快慢不说,至少没停下吧。该有的都会有的。不瞎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 类型的,两个之间是没有任何关联的,不能强制转换,就会导致错误!!
以上是关于Swift3.0 多态 继承 强制转换的主要内容,如果未能解决你的问题,请参考以下文章