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 类型的,两个之间是没有任何关联的,不能强制转换,就会导致错误!!

时间: 2024-08-24 10:46:51

Swift3.0 多态 、继承 、 强制转换的相关文章

C++继承强制转换

1. 派生类对象可以强制转换为基类对象 #include <iostream> using namespace std; class base{ public: int a; base(int x=0):a(x){} void print(){cout<<a<<endl;} }; class son:public base { public: char y; son(char x):y(x){} operator double(){ return 1.3423;} vo

面向对象的过程、继承、封装、多态;抽象类、访问修饰符的使用、引用类型强制转换、方法重写@override与重载、空指针异常、super关键字

面向对象设计的过程:     发现类-发现类的属性-发现类的方法-优化设计: 封装: private类型的,只可以在本类中使用,当其他类调用此类时,不可使用,因此可以设置setget方法,如下所示: 构造------------------------ 默认有无参构造,若设置了有参构造,则就没有默认的无参构造了,需要自己再添加一个 方法重载------------------- 方法名相同,参数列表不同(类型,数量,顺序不同,与参数名无关): 与返回值,访问修饰符无关 面向对象(OO)的优点--

c++ 继承类强制转换时的虚函数表工作原理

本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace std; class Base { public: virtual void f() { cout<<"Base::f()"<<endl; } }; class child1:public Base { public: virtual void f() { cout&l

TypeError: Error #1034: 强制转换类型失败:无法将 &quot;0.49&quot; 转换为 mx.graphics.IFill。

1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.series::LineSeries/updateDisplayList()[E:\dev\4.0.0\frameworks\projects\datavisualization\src\mx\charts\series\LineSeries.as:1091] at mx.core::UIComponent/val

Swift3.0学习实践-一个简单的画板(七色轨迹、可撤销、可清除、带橡皮擦)

写着玩儿的小程序,继续学习Swift.运行效果+代码+知识点总结 运行效果:             代码: Canvas类:画布,画图板状态管理.交互.处理手势 [plain] view plain copy class Canvas:UIView{ //负责线条的生成.操作与管理 let pathCreator:PathCreator //是否处于擦除状态 var isInErasering:Bool //橡皮擦视图 let eraserView:UIView override init(f

[C/C++]_[使用dynamic_cast 强制转换的优点]

场景: 1. C++引入了dynamic_cast 这种类型识别的强制转换,对识别错误的程序是有好处的,建议能用的地方就用,它能在转换错误时返回0或抛出异常,比起C的旧强制转换 执行转换了不对类型依旧不会报错可靠些,因为这类错误如果发生了,其实很难找出来. 好处: 1.用在多态的子类情况下,父类不能提供处理接口,这时可以针对子类做特殊的处理. 2.dynamic_cast比另外3个cast优势就是会对转换进行检查,如果出错,会报错. 补充一个知识点: 左值和右值 (摘录自C++ Primer 3

Swift2.3 --&gt; Swift3.0 的变化

Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift2.3的代码转换为Swift3.0. 手动调出Xcode自动转换Swift2.3 到 Swift3.0 弹出语言版本选择界面,选择Covert to Swift3,Next:  进入选择模块界面: 选择模块界面 建议只选择自己创建的模块,第三方框架的模块最好不要使用Xco

mfc 类型间的强制转换

一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换. 进行上行转换(把子类的指针或引用转换成基类表示)是安全的: ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum.这种转换的安全性也要开发人员来保证. ③把空指针转换成目标类型的

C++类型强制转换&lt;转&gt;

转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类型转换.如子