前言

  • 在 Swift 语言中一般使用 is 关键字实现类型检查,使用 as 关键字实现类型转换,除此之外还可以通过构造器和方法来实现类型转换。

1、类型检查

1.1 使用 is 检查

  • 类型检查操作符 is 可以用来检查一个实例是否属于特定子类型,若属于那个类型,则类型检查操作符返回 true, 否则返回 false

    class Transport {
    
        var scope = ""
    
        init(scope: String) {
    self.scope = scope
    }
    } class Car: Transport { var type = "daba" init(scope: String, type: String) {
    super.init(scope: scope)
    self.type = type
    }
    } class Airplance: Transport { var company = "dongfanghangkong" init(scope: String, company: String) {
    super.init(scope: scope)
    self.company = company
    }
    } var carNum = 0
    var airNum = 0 let journey = [
    Car(scope: "ludi", type: "daba"),
    Car(scope: "ludi", type: "gongjiaoche"),
    Airplance(scope: "hangkong", company: "dongfanghangkong"),
    Car(scope: "ludi", type: "chuzuche")
    ]
    for tra in journey {
    
        if tra is Car {                                 // 检查是否属于 Car 类型
    carNum += 1
    } else if tra is Airplance { // 检查是否属于 Airplance 类型
    airNum += 1
    }
    } print(carNum) // 3
    print(airNum) // 1

1.2 使用 as? 检查

  • 安全转型 as?,用于不确定是否可以转型成功的情况,如果转型成功则执行转型,如果转型行不通,就会返回 nil,这时可以使用 as? 做类型检查。

    for tra in journey {
    
        if let _ = tra as? Car {                        // 检查是否属于 Car 类型
    carNum += 1
    } else if let _ = tra as? Airplance { // 检查是否属于 Airplance 类型
    airNum += 1
    }
    } print(carNum) // 3
    print(airNum) // 1

2、类型转换

2.1 使用 as 转换

  • 有时候我们需要的某个类型的实例可能实际上是该类型的一个子类,可以使用关键字 as 尝试对它使用向下转型得到它的子类。

  • 向下转型分为两种。

    • 安全转型 as?,用于不确定是否可以转型成功的情况,如果转型成功则执行转型,如果转型行不通,就会返回 nil,这时可以使用 as? 做类型检查。
    • 强制转型 as!,只用在确定向下转型一定能够成功的情况下,当试图将实例向下转为一个不正确的类型时,会抛出异常。
  • is 关键字相比,使用 as 除了可以检查类型外,还可以访问子类的属性或者方法。通常为了使用转型成功的实例,搭配使用可选绑定。

    for tra in journey {
    
        if let car = tra as? Car {                      // 转换成 Car 类型
    print(car.type)
    } else if let airplane = tra as? Airplance { // 转换成 Airplance 类型
    print(airplane.company)
    }
    }

2.2 使用 “构造器的方法” 转换

  • 使用类型的构造器转换

    let d: Double = 12.3
    let i = Int(d) // 12

Swift 类型检查与类型转换的更多相关文章

  1. Swift类型检查与转换

    继承会发生在子类和父类中,如图所示,是一系列类的继承关系类图,Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类.这个继承关系类图的具体实现 ...

  2. Swift—类型检查与转换-备

    继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类. 这个继承关系类的具体实现代码 ...

  3. Swift - 类型判断is 与 类型转换as

    在Swift中,通常使用is和as操作符来实现类型检查和转换.下面通过样例来演示使用方法,首先定义几个类. 1 2 3 4 5 6 7 8 9 10 11 //基类,人类 class Human{ } ...

  4. 《从零开始学Swift》学习笔记(Day48)——类型检查与转换

    原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Pers ...

  5. 《从零開始学Swift》学习笔记(Day48)——类型检查与转换

    原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 比如:Person是类层次结构中的根类.Student是Person的直接子类.Worker是Pers ...

  6. 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套

    一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...

  7. swift 类型.

    swift 类型 变量声明 用let来声明常量,用var来声明变量 可以在一行中声明多个常量或者多个变量,用逗号隔开 var x = 0.0, y = 0.0, z = 0.0 类型安全 Swift ...

  8. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

  9. Java中静态类型检查是如何进行的

    以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间 ...

随机推荐

  1. Mysql写入中文出错

    本地调试好像正常,服务器运行报错: UnicodeEncodeError: 'latin-1' codec can't encode character u'\u5206' in position 2 ...

  2. Flask刷新问题

    修改页面中内容,特别是图片后,总是刷新不了.调试时,我常常通过修改端口来解决,从80-99不断改. 服务器部署,也遇到同样问题,重启web服务器,重启计算机都不行,网页已经改过来了,但是图片还是老图片 ...

  3. “服务器推”技术【转载+整理】

    原文地址 本文内容 "服务器推(server-push)"技术的应用 基于客户端套接口的"服务器推"技术 基于 HTTP 长连接的"服务器推" ...

  4. Android Context完全解析,你所不知道的Context的各种细节

    Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了.但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学 ...

  5. asp.net给文件分配自己主动编号,如【20140710-1】

    在开发办公软件的时候,须要给非常多文件什么的东西分配一个编号.是依照日期来的,比方2014.07.10的第一个文件编号就为20140710-1,这一天的第二个文件编号就为20140710-2,以此类推 ...

  6. html块元素和内联元素

    html块元素和内联元素: 对于html各种标签/元素,可以从块的层面做一个分类:要么是block(块元素),要么是inline(内联元素). block元素的特点: 总是另起一行开始: 高度,行高以 ...

  7. vcenter SSO

  8. Go语言中Restful模式与Routes路由框架

    1.用法: (1)导入包github.com/drone/routes (2)使用包中的New()方法建立一个routes.RouteMux对像的引用.其它也能理解为一个http.Handler,只是 ...

  9. DbScopeFactory

    using (var db = DbScopeFactory.Create()) { //这里修改数据 db.SaveChanges(); }

  10. 8个很实用的在线工具来提高你的Web设计和开发能力

    近期在网上看到一张帖子感觉不错.只是是英文版的今天闲着没事锻炼一下英语能力分享给大家看看! 原文地址:http://webdesignledger.com/tools/8-useful-online- ...