在Swift中一般使用“is”关键字实现类型检查,使用“as”关键字实现类型转换,首先说一个类型层次概念,举个例子,创建一个基类:

class Person {var weight:Floatinit(weight:Float) {self.weight = weight}
}

之后创建两个继承它的子类,并且在子类中定义子类特有的属性:

class Chinese: Person {var name:String = "张三"init(name:String,weight:Float) {super.init(weight: weight)self.name = name}
}class American: Person {var age:Int = 30init(age:Int,weight:Float) {super.init(weight: weight)self.age = age}
}

然后新建一个数组:

let array = [Chinese(name: "张三", weight: 50.0),American(age: 30, weight: 60.0),Chinese(name: "李四", weight: 55.0),American(age: 40, weight: 65.0)]

中国人和美国人都是人类的子类,且各自定义了各自的构造器,现在他们共同构成了一个类层次。我们知道,Swift的数组类型中只能保存相同类型的元素,但是我们可以把类层次中的类加入到数组中。根据Swift的强大的类型推测能力,可以自行检测出ChineseAmerican有共同的父类Person,所以数组的类型是[Person]

在Swift内部数组中,ChineseAmerican类依旧是他们本身的类型,但在遍历数组元素时,取出的实例都是Person类型的,为了把这些实例还原成他们本身的类型,需要进行类型判断和类型检测。

is:类型检查

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

用法:

        var chinaCount = 0var ameriCount = 0        for person in array {if person is Chinese {chinaCount += 1} else if person is American {ameriCount += 1}}        print(chinaCount) //输出 3print(ameriCount) //输出 2

as:类型转换

如上例所示,有时候我们需要某个类型的实例可能实际上是该类型的一个子类,可以使用关键字“as”对其进行向下转型得到它的子类。向下转型分为两种,安全转型(as?)和强制转型(as!),类似于可选型和解包的用法。安全转型用于不确定是否可以转型成功的情况,如果转型成功则执行转型,如果转型行不通,就返回nil,这时候可以使用as?来检查转型。

而强制转型只用于在确定向下转型一定成功的情况下,当试图将实例向下转为一个不确定的类型时,会抛出异常。

is关键字相比,as除了可以检查类型外,还可以访问子类的属性或者方法。通常为了使用转型成功的实例,搭配使用可选绑定。例如:

        for person in array {if let chi = person as? Chinese {print(chi.name)} else if let ame = person as? American {print(ame.age)}}

上述代码中,遍历数组时取出的可能是Chinese类,也可能是American类,所以使用安全转型as?

Swift - is(类型转换)和 as(类型转换)相关推荐

  1. number类型转换java_Number()数据类型转换

    Number() 如果是 Boolean 值, 和. 如果是数字值,只是简单的传入和返回. 如果是 . 如果是 undefined,返回NaN. 如果是字符串,遵循下列规则: 如果字符串中只包含数字( ...

  2. C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换

    1. 定义 类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型 形式 : operator type() const type 表示某种类型,类型 ...

  3. C语言数据类型转换(自动类型转换 强制类型转换)

    数据类型转换就是将数据(变量.数值.表达式的结果等)从一种类型转换为另一种类型. 自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. ...

  4. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

  5. c语言float转换为int_C语言的隐式类型转换和显示类型转换

    C语言是一种强类型语言,当使用一种类型的对象代替另外一种类型的对象进行操作时,必须首先进行类型转换. 类型转换的方式,一般可分为隐式类型转换和显示类型转换(也称为强制类型转换). 1.隐式类型转换 隐 ...

  6. JAVA语法——自动类型转换和强制类型转换

    package 自动类型转换和强制类型转换;public class 自动类型转换和强制类型转换 {public static void main(String[] args){byte b = 12 ...

  7. Java类型转换(自动类型转换+强制类型转换)

    一. 自动类型转换(隐式类型转换) 整型.实型(常量).字符型数据可以混合运算.运算中,不同类型的数据先转化为同一类型,然后进行运算. 自动转换从低级到高级. 自动转换有以下规律: 1.小的类型自动转 ...

  8. 【c语言】c语言的自动类型转换和强制类型转换

    前言--数据类型 在介绍数据类型转换之前,我们首先要清楚一个知识点:数据类型的级别高低. 我们所提到的数据类型,比如整数型int,浮点型float,它们在计算机中其实是以二进制–也就是0和1的方式存储 ...

  9. C语言数据类型转换(自动类型转换+强制类型转换)

    自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生. 1)将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如 floa ...

  10. 类型转换、强制类型转换

    目录 一.类型转换 二.隐式类型转换 三.算术转换 四.降级 五.强制类型转换 一.类型转换 有些表达式的操作数在求值的过程中需要先转换成其他类型再进行运算,这一操作称为数据类型转换. 有些人会问,为 ...

最新文章

  1. 一个fork短码的扩展版本
  2. Java IO编程全解(五)——AIO编程
  3. 使用VS2010调用matlab的mat格式文件
  4. 宏基ec471g黑苹果_宏碁acer ec-471g 黑苹果配置教程
  5. VMware Workstation 10装Mac OS X 10.9
  6. Deepin安装最新显卡RTX2080Ti及CUDA10.1
  7. 条件编译 #ifndef _HEAD_H...中下划线的理解
  8. VC++6.0 按F1无法打开 MSDN 的解决办法
  9. [转]Vue Cli3 + VS Code 愉快调试
  10. 【Opengl】Glut下载与环境配置
  11. word怎么显示计算机数字,如何键入word2007圆圈数字1到10及以上?
  12. 计算机配置动态硬盘,【转】基本磁盘动态磁盘GTP磁盘MBR磁盘RAID阵列磁盘的区别(一)...
  13. POJ 3764 Trie + 贪心
  14. js 实现大小写转换的方法
  15. 打造自己的域名转向
  16. 通过电脑重置解决小米笔记本巨卡无比的问题
  17. 程序员不好好写报告的结果是很严重的
  18. 腾讯WiFi码推广,扫码连WiFi小程序代理入驻后如何推广使用教程!
  19. 实现Torchlight(火炬之光)的背包UI效果
  20. Rdata数据导成txt,csv,spss,stata等格式

热门文章

  1. Someting Useless
  2. VS2010 编译程序自动生成ipch文件夹和.sdf文件
  3. Vue实现图片上传功能:
  4. C语言符号-取余\取模运算
  5. C语言求4位数的反序数
  6. 生信分析常用编程语言汇总
  7. vmware虚拟机Linux系统中英文输入法及切换方法
  8. java tftp_具体分析tftp server配置的步骤(转)
  9. node爬虫遇上301重定向Moved Permanently
  10. 蓝桥杯单片机(四)动态数码管