加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift3.0 - 类型转换

发布时间:2020-12-14 06:22:48 所属栏目:百科 来源:网络整理
导读:Swift3.0 - Type Casting 类型转换 http://blog.csdn.net/brycegao321/article/details/53311964 https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/ui

Swift3.0 - Type Casting 类型转换

http://blog.csdn.net/brycegao321/article/details/53311964

https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID338


类型转换包括判断对象的基类和将基类引用转换为派生类引用。 Swift使用is判断当前对象是否为某个类的对象, 作用同Java的instanceof关键字; Swift使用as作为强转操作符, 将基类引用转换为派生类引用。

基类:

[java] view plain copy
  1. classMediaItem{
  2. varname:String
  3. init(name:String){
  4. self.name=name
  5. }
  6. }
2个MediaItem的派生类(注意:在Swift中先初始化派生类的成员变量,然后再执行父类的构造函数):

copy

classMovie:MediaItem{
  • vardirector:String
  • init(name:String,director:String){
  • self.director=director
  • super.init(name:name)
  • }
  • classSong:MediaItem{
  • varartist:String
  • self.artist=artist
  • }

  • 声明一个数组,包含基类和派生类的对象, 那么该数组的数据类型是 基类

    copy

    letlibrary=[
  • Movie(name:"Casablanca",director:"MichaelCurtiz"),
  • Song(name:"BlueSuedeShoes",artist:"ElvisPresley"),
  • Movie(name:"CitizenKane",director:"OrsonWelles"),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Song(name:"TheOneAndOnly",artist:"ChesneyHawkes"),248)"> Song(name:"NeverGonnaGiveYouUp",artist:"RickAstley")
  • ]
  • copy

    iflibraryis[MediaItem]{
  • print("library'stypeis[MediaItem]")
  • }
  • 输出: library's type is [MediaItem]

    说明: library数组相当于[MediaItem]类型的数组。


    上面提到了is关键字的用法, 跟Java的instanceof完全一样。 请注意is关键字不仅在判断当前类返回true,所有的父类也同样返回true。参看示例代码:

    copy
    varsong=Song(name:"zhangsan",artist:"zhuanji")
  • ifsongisMediaItem{
  • print("songisinheritbyMediaItem")
  • ifsongisSong{
  • print("songisobjectofSong")
  • 输出:

    song is inherit by MediaItem

    song is object of Song



    Swift提供了as?和as!作为类型强转的操作符, 用法类似于try?和try!。

    as?是可选类型,如果对象属于这个类那么强转为对应的引用,否则返回nil。

    as!是强制类型转换,如果转换失败则会出现运行时错误。

    copy

    varobjSong=Song(name:"li",artist:"wu")
  • ifletparam=objSongas?Song{
  • print("objSongisfromSong")
  • ifletparam=objSongas?Movie{
  • print("objSongisfromMovie")
  • ifletparam=objSongas?MediaItem{
  • print("objSongisfromMediaItem")
  • 输出:

    objSong is from Song

    objSong is from MediaItem


    如果将as?改成as!会怎样?

    copy

    do{
  • tryobjSongas!Movie
  • }catch{
  • print("objSongisnotfromMovie")
  • 前面提到as!如果转换失败时会导致运行时错误, 而且捕获不到异常。 即使像上面这样写仍然会出现运行时错误!

    Swift提供了2种通用数据类型, 作用类似于Java的Object和OC的NSObject。

    Any: 可以指向所有的数据类型,甚至包含函数类型;

    AnyObject:可以指向所有的类对象;

    copy

    varthings=[Any]()
  • things.append(0)
  • things.append(0.0)
  • 42)
  • 3.14159)
  • things是可以插入所有数据类型的数组。

    Swift还提供关键字as,作用类似于is,即判断数据类型。示例代码:

    copy

    forthinginthings{
  • switchthing{
  • case0asInt://可理解成“作为整型的数值0”
  • print("zeroasanInt")
  • 0asDouble://“作为浮点型的数值0”
  • print("zeroasaDouble")
  • caseletsomeIntasInt:
  • print("anintegervalueof(someInt)")
  • default:
  • print("somethingelse")
  • 输出:
    copy
    //zeroasanInt
  • //zeroasaDouble
  • //anintegervalueof42

  • 类似于捕获崩溃的try、try?和try!, 类型转换操作符是as、as?和as!;二者逻辑是一样的,问号表示可选数据类型,感叹号表示强制执行。

    小结:

    1、Swift使用is判断属于某个类, 作用同Java的instanceof;

    2、Swift使用Any表示所有数据类型、AnyObject表示所有类对象类型;类似于Java的Oject和OC的NSObject。

    3、使用as?和as!做数据类型强转,as用于判断是否某个数据类型。

    4、as和is关键字的作用有点像,但不能相互替代。 is可用于if判断条件中, as可理解为“作为**数据类型”并且多用于switch/case中。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读