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入门(十一)——类型转换与is、as操作的更多相关文章
- Swift入门(五)——数组(Array)
集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,各自是数组(Array)和字典(Dictionary). 他们的主要差别在于数组中的元素由下标确定.而字典中的数据的值由数据的键(K ...
- Swift入门(一)——基本的语法
近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* - ...
- Swift入门(十)——循环引用、弱引用和无主引用
近期看到swift里面不仅有循环引用和弱引用(weak),还加入了无主引用(unowned),于是写了一些demo,这里总结一下. 和OC一样.Swfit默认也是基于ARC进行内存管理的,因此尽管简单 ...
- Swift入门(四)——可选类型(Optionals)与断言(Assert)
可选类型是什么? 首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,能够把String类型变量转换为Int类型变量. var stringValue = "5&q ...
- Swift入门篇-基本类型(2)
现在我也在学习Swift语言,常常去逛很多苹果社区和论坛,看到了圈子很多奇怪的现象,发现很多人都赶忙去翻译 Swift书籍 和 发布Swift的视频 .他们这种对新知识的探索精神我本人是很佩服的.但是 ...
- Swift入门
Swift 入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工 ...
- jQuery入门(2)使用jQuery操作元素的属性与样式
jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...
- Swift入门学习之一常量,变量和声明
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...
- Swift入门篇-闭包和函数
今天主要是给大家分享的是 swift中闭包的用法,我个人觉得闭包就是函数的简写方法,如果您函数不是很熟悉请查阅 swift入门篇-函数 1:函数类型 函数类型 var 变量 :(类型)->返回值 ...
- Swift入门篇-循环语句
今天早上一起来所有新闻都是报道荷兰5-1战胜西班牙,我一看没有搞错吧,顿时想都如果中国队vs荷兰队也不至于会输的怎么惨吧,难道是荷兰队开挂了,于是我看了一下昨天比赛的视频直播,还真是新闻报道的那样,顿 ...
随机推荐
- js阻止冒泡事件及默认操作
1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览器实现 .jQuery对 ...
- 菜鸟学习Struts——简易计算器
这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
- Java反射在JVM的实现
1. 什么是Java反射,有什么用?反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段.这使反射成为构建灵活应用 ...
- phpcms v9 企业黄页系统发布没有表单出现的解决方案
第一种解决方案: 第一步:把yp_UTF8压缩文件解压得到:api.caches.phpcms.statics四个文件夹. 第二步:把这四个文件夹分别覆盖已安装好的phpcms系统根目录下的文件夹.这 ...
- cocos2.2.3中创建精灵对象的三大类方法
1.众生相,皆精灵 2.精灵的类继承关系 class CCSprite : public CCNode, public CCNodeRGBA, public CCTextureProtocol 3.创 ...
- javascript之流程控制 和函数的容易忽略点
1.流程控制 1> for in 仅用于 对象的遍历: var box={ "name":'小红', 'age':18, 'height':165 }; for(var b ...
- Perceptron Learning Algorithm (PLA)
Perceptron - 感知机,是一种二元线性分类器,它通过对特征向量的加权求和,并把这个”和”与事先设定的门槛值(threshold)做比较,高于门槛值的输出1,低于门槛值的输出-1.其中sign ...
- svn:Repository UUID 'XXX' doesn't match expected UUID 'YYY'
About a month ago, CodePlex have upgraded their TFS servers to to TFS 2010. While this transition wa ...
- [搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器:http://www.sosobta.com 大家可以给提点意见... 出售商业网站代码,万元起,非诚勿扰,谢谢. 联系h31h31 a ...