前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift 2.2 多态和强制转换

Swift 2.2 多态和强制转换

作者头像
Mr.RisingSun
发布2018-01-09 17:04:45
6720
发布2018-01-09 17:04:45
举报
文章被收录于专栏:移动端开发移动端开发

 写在前面:

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

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

  一:多态的概念:

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

     Swift 引用变量有两个类型

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

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

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

代码语言:javascript
复制
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? 运算符,这个前面说话过可选类型符号 ? (不理解可以翻我前面的博客) 看看下面代码。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档