Swift入门(十一)——类型转换与is、as操作

三种操作:is、as?和as!

Swift是强类型语言,但也允许开发者通过is、as?和as!这三种操作来对类型进行判断和强制转换。其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强制形式。在这里强调一下,swift中比较常用的向下转换(downcast)是没有as操作符的。

为了方便后面的解释,这里假设定义了三个类,Fruit、Apple和Orange,其中Apple和Orange都继承自Fruit。

is操作符

is操作用来判断某一个对象是否是某一个特定的类,它会返回一个bool类型的值。is操作的逻辑很简单,某一个类的对象肯定是自己这个类,也一定是自己的超类,但超类的对象不是子类。如果两个类没有继承关系,那is操作一定返回false.

下面用代码举几个例子看一下:

if apple is Apple{
    println("这是个苹果")  //某个类的对象一定是自己这个类
}

if apple is Fruit{
    println("这是个苹果")  //某个类的对象也一定是它的超类
}

if fruit is Apple{
    println("这是个水果")  //但超类的对象不是它的子类
}

if apple is Orange{
    println("这是个橘子")  //没有继承关系的类肯定返回false
}

需要注意的是,这里所说的一个对象的类,是指它真实的类而不是表现出来的类。比如把apple1和orange1放进数组,再取出来,由于数组的类型是[Fruit],所以通过下面这行代码:

var fruit = array[0]

取出的fruit,虽然在swift中的表现形式为Fruit,但它实际上是Apple类的对象,在对它使用is操作的时候,要把它当做Apple类的对象来考虑。因此,虽然超类的对象不是子类,但fruit is Apple的返回值却应该是true。

as!操作符

as!操作符是类型转换的强制格式,优点在于代码简单,如果可以转换,则会返回转换了格式的对象,如果无法转换就会抛出运行时错误。因此除非百分之百确定可以转换,否则不应该使用as!来进行强制类型转换。

和is操作符非常类似,类型转换的规则是,某个类的对象可以转换为自己这个类(这个其实是废话),子类可以向上转换为超类,但超类不能向下(downcast)转换为子类。除非某个子类的对象表现形式为超类,但实际是子类,这时可以使用as!进行向下转换(downcast)。

用代码来说明一下:

// 这里假设fakeFruit是一个表现为Fruit类的Apple类对象
var fruit1 = fakeFruit as! Apple  //这是as!的最常见用法,可以成功转换
var fruit2 = fakeFruit as! Fruit  //成功,子类可以向上转换为超类
var fruit3 = fakeFruit as! Orange //失败,没有继承关系的类不可以转换
var orange = realFruit as! Orange //失败,超类不可以强制转换为子类 

as?操作符

as?和as!操作符的转换规则完全一样,但是as?会返回一个被转换类型的可选类型,需要我们解封。因此写法会略有不同,以刚刚的第一个例子来说:

if var fruit = fakeFruit as? Apple{
    //Do something with fruit
}

另外,由于是可选类型,即使转换失败也不会报错,所以比较推荐使用这种方式进行类型转换。

查看完整专栏——《Swift轻松入门》

【Swift入门(一)——基本语法】

【Swift入门(二)——字符与字符串】

【Swift入门(三)——元组(Tuple)】

【Swift入门(四)——可选类型(Optionals)与断言(Assert)】

【Swift入门(五)——数组(Array)】

【Swift入门(六)——字典(Dictionary)】

【Swift入门(七)——结构体(Struct)】

【Swift入门(八)——功能强大的求余运算符】

【Swift入门(九)——String与Int、Double、Float等数字相互转换】

【Swift入门(十)——循环引用、弱引用和无主引用】

【Swift入门(十一)——类型转换与is、as操作】

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-13 08:55:18

Swift入门(十一)——类型转换与is、as操作的相关文章

IOS开发语言Swift入门连载---类型转换

IOS开发语言Swift入门连载-类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 类型转换在 Swift 中使用is 和 as 操作符实现.这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型. 你也可以用来检查一个类是否实现了某个协议,就像在 Checking for Protocol Conformance部分讲述的一样. 定义一个类层次作为例子 你可以将它用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的

Swift入门(十二)——利用Extension添加逆序输出字符串方法

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法. 首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法.下面先贴上代码,然后解释一下这段代码. //String+Operation.swifft import Foundation //逆序输出swift中的字符串 extension String{ func Reverse()

Swift入门(一)——基本的语法

近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* --*/ 常量 常量是指定义之后无法改动值的量,比方设置一个最大尝试登陆的次数,它的值一旦被确定,就不应该在程序中被改动.swift中的常量用let表示.定义方法例如以下: let maxAttemptTime = 3 //正确 maxAttemptTime = 4 //错误.常量一旦定义不能够改变

Swift入门教程:基本语法(二)

数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   // 1999.0 可以增加额外的下划线 _ ,以增强可读性 let oneMillion1 = 1_000_000    // 1000000 let oneMillion2 = 100_0000      // 1000000 let overOneMillion = 1_000_000.000

IOS开发语言Swift入门连载---类和结构体

IOS开发语言Swift入门连载-类和结构体 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体中实现各种功能,我们必须要严格按照常量.变量以及函数所规定的语法规则来定义属性和添加方法. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意: 通常一个类 的实例被称为对象 .然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本

IOS开发语言Swift入门连载---协议

IOS开发语言Swift入门连载-协议 协议(Protocol) 协议(Protocol)用于定义完成某项任务或功能所必须的方法和属性,协议实际上并不提供这些功能或任务的具体实现(Implementation) –而只用来描述这些实现应该是什么样的.类,结构体,枚举通过提供协议所要求的方法,属性的具体实现来采用(adopt) 协议.任意能够满足协议要求的类型被称为协议的遵循者. 协议可以要求其遵循者提供特定的实例属性,实例方法,类方法,操作符或下标脚本等. 协议的语法 协议 的定义方式与类,结构

Swift入门(五)——数组(Array)

集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,分别是数组(Array)和字典(Dictionary).他们的主要区别在于数组中的元素由下标确定,而字典中的数据的值由数据的键(Key)决定.以下我们认为集合就是数组或字典. 集合的可变性 我们可以定义一个集合常量或者集合变量.一旦定义为常量,就意味着集合的长度.内容和顺序都不能再修改了.比如,定义为常量的数组,不能再向其中添加新的元素. 数组的创建 由于swift中变量的创建遵循" var 变量名:变量类型 "的语法

Swift入门(九)——String与Int、Double、Float等数字相互转换

三种转换模式 任何语言里面,Int.float.double等数字类型自成一派,但它们和String类型之间的转换总是不太方便,这里总结一下它们相互转换的方法.总结下来一共有三种转换模式,分别举例说明. 一.String转数字 这里以String类型转Int类型为例.String转其他的数字类型(Float.Double等)大同小异.主要用到的方法是String类型的toInt方法.注意这个方法返回的是Int?,即一个整数可选类型.所以需要解封. var string = "1234"

Swift入门篇-集合

一:数组 一:可变数组 定义:数组使用有序列表存储相同类型的多重数据. 格式: 第一种格式 var 变量: 类型[] = [变量值,变量值,...] 第二种格式 var 变量 =[变量值,变量值,...] 说明: 1:[变量值,变量值...] 这样表示数组 ,前提是 变量值的类型必须一值.(和其他语言有所不同) 2:上面两种格式都是定义一个数组,数组中的变量值的类型必须一致 3:第一种格式定义的数组,是直接定义数组,第二种格式定义的数组 是编译器通过类型值推导出是数组格式 注意点 1:常量关键字