1,as使用场合

(1)从派生类转换为基类,向上转型(upcasts)

class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal

(2)消除二义性,数值类型转换

let num1 = 42 as CGFloat
let num2 = 42 as Int
let num3 = 42.5 as Int
let num4 = (42 / 2) as Double

(3)switch 语句中进行模式匹配

如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。

switch animal {
case let cat as Cat:
    print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
    print("如果是Dog类型对象,则做相应处理")
default: break
}

2,as!使用场合

向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。

class Animal {}
class Cat: Animal {}
let animal :Animal  = Cat()
let cat = animal as! Cat

3,as?使用场合

as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional),需要我们拆包使用。
由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?

let animal:Animal = Cat()
if let cat = animal as? Cat{
    print("cat is not nil")
} else {
    print("cat is nil")
}

as、as!、as?的更多相关文章

  1. nsmutablearray – Sprite Kit iOS7 – SKNode UserData属性不存储值

    谢谢解决方法userData属性最初为零.您必须先创建一个字典并进行分配:

  2. Friday Q&A 2015-11-20:协变与逆变

    作者:MikeAsh,原文链接,原文日期:2015-11-20译者:Cee;校对:千叶知风;定稿:numbbbbb在现代的编程语言中,子类型和超类型已经成为了非常常见的一部分了。但并不意味着所有的Animal都是Cat。CrazyCatLady.purchaseAnimal会返回一只Cat。类似,CrazyCatLady返回的Cat也是有效的。CrazyCatLady的pet方法期望参数是一只Cat。这破坏了Liskov替换原则:此时的CrazyCatLady并不能在任意的地方替代Person的使用。与此

  3. as、as!、as?

    1,as使用场合从派生类转换为基类,向上转型消除二义性,数值类型转换switch语句中进行模式匹配如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。使用场合向下转型时使用。由于是强制类型转换,如果转换失败会报runtime运行错误。成功的话返回可选类型值,需要我们拆包使用。在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用as!

  4. swift – 类方法的协议

    我想在协议中声明一个类func,我打算从A,B和C类符合这个协议.B和C继承自A.基本上我想在B和C中覆盖这个func,同时仍然在A中提供一个实现.所以,我必须声明我的协议如下:然后我在A中有这个:这里的问题很明显,Xcode证实:“类方法会覆盖’最终’类方法”.我该如何解决这个问题?我不能在协议中使用classfunc…我不知道如何抽象这个.谢谢!

  5. android – 如何在volley中发送json数组作为post请求?

    我正在使用volley进行json解析.我想使用POST向服务器端发送一些数据.我正在尝试发送.现在任何人都可以告诉我如何将过滤器阵列发送到服务器?

  6. 如何在R Windows中将Unicode字符串写入文本文件?

    l10n_info)中,输出文件“yes-iconv”,“latin”和“unkNown”应该是正确的.在“UTF-8”语言环境中,文件“no-iconv”和“unkNown”应该是正确的.示例代码的输出如下,使用在Wine上运行的R3.3.264位Windows版本:在原始示例中,iconv()使用默认的from=“”参数,这意味着从当前语言环境转换,这实际上是“latin1”.因为str的编码实际上是“UTF-8”,所以字符串的字节表示在步骤中失真,但是当它(可能)将字符串转换回当前语言环境时,由ca

  7. ubuntu添加账号

    ubuntu添加账号查看所有用户的crontabubuntusshkey登陆ssh连接提示Permissiondenied(publickey)怎么破?

  8. PHP和MYSQL:使用group by作为类别

    我的数据库具有以下设置我想像这样输出它们:我把它们组合在一起使用,并且工作正常,但我想循环遍历每个组并显示该组的内容.我该怎么做?我建议只需要一个简单的查询来获取所有行,按类别ID排序.仅当其值从上一行更改时才输出该类别.

  9. php – SimpleXML:将一棵树追加到另一棵树上

    我有两个XML树,并希望添加一个树作为另一个树叶.显然:不起作用,因为它仅复制第一个根节点.好的,所以我以为我会遍历整个第一棵树,每一个元素逐个添加到第二个树.但是请考虑这样的XML:如何访问“ccc”?tree1>children()只返回“bbb”….您不能直接使用SimpleXML添加“树”,如您所见.但是,您可以使用某些DOM方法为您提供同样的基础XML,同时也可以为您提供解决方案.

  10. 单台centos机器启动多个vsftpd服务

    单服务器上vsftpd服务指定不同的端口以及不同的系统用户,来启动多个vsftpd服务。

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部