• 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套


    一 类型检查

    1、 类型检查操作符

          类型检查用来检查或转换一个实例的类型到另外的类型的一种方式。

          在Swift中,类型检查使用is和as操作符来实现。

          is操作符用来检查一个实例是否是某种特定类型,如果是返回true,否则返回false。

          as操作符用来把某个实例转型为另外的类型,由于实例转型可能失败,因此Swift为as操作符提供了两种形式:选项形式as?和强制形式as。

          选项形式(as?)的操作执行转换并返回期望类型的一个选项值,如果转换成功则返回的选项包含有效值,否则选项值为 nil

          强制形式(as )的操作执行一个实例到目的类型的强制转换,因此使用该形式可能触发一个运行时错误。

          如下例所示。

    class MediaItem {

       var name:String

       init(name:String) {

           self.name =name

        }

    }

    class Movie:MediaItem {

       var director:String

       init(name:String,director:String) {

           self.director =director

           super.init(name:name)

        }

    } 

    class Song:MediaItem {

       var artist:String

       init(name:String,artist:String) {

           self.artist =artist

           super.init(name:name)

        }

    }

    let library = [

       Movie(name:"Casablanca",director:"Michael Curtiz"),

       Song(name:"Blue Suede Shoes",artist:"Elvis Presley"),

    Astley")

    ]

    var movieCount =0

    var songCount =0 

    for item in library {

       if item is Movie {

            ++movieCount

        }else if item is Song {

            ++songCount

        }

    }

    for item in library {

       if let movie =item asMovie {

           println("Movie: '(movie.name)', dir. (movie.director)")

        }else if let song =item asSong {

           println("Song: '(song.name)', by (song.artist)")

        }

    }

         本例首先定义了一个媒体类的继承树,其中两个类Movie和Song都继承自其基类MediaItem,接着定义一个包含这两个媒体项实例的数组library,然后在for in循环中使用is操作符来检查某个媒体项是否是特定类型的实例,使用as操作符的选项形式as?来转换媒体项的实例为特定类型的实例。

    2、 任意类型的使用

      Swift提供了两个特定的类型别名:AnyObject与Any。

      AnyObject类型能代表任何类类型。

      Any类型能代表任意除了函数类型之外的所有其它类型。

      例子展示了如何使用AnyObject类型定义一个AnyObject类型的数组以及该数组的使用,AnyObject类型的数组成员可以是任意的类的实例,例子中为Movie类的实例。

    let someObjects:AnyObject[] = [

       Movie(name:"2001: A Space Odyssey",director:"Stanley Kubrick"),

       Movie(name:"Moon",director:"Duncan Jones"),


    ]

    for object in someObjects {

       let movie =object as Movie  

       println("Movie: '(movie.name)', dir. (movie.director)")

    }

    //以上循环使用as操作符强制转换一个类型为AnyObject的实例为确定的类型Movie类的实例,因此可能出现运行时错误。

     //也可以直接使用as 操作符直接把someObjects类型的数组转型为Movie类型的数组,如下:

     for movie in someObjects as Movie[] {

       println("Movie: '(movie.name)', dir. (movie.director)")

    }

         如下例子展示Any的使用,可以使用Any来代替任何类型。

    var things =Any[]() 

    things.append(0)

    things.append(0.0)

    things.append("hello")

    things.append((3.0,5.0))

    things.append(Movie(name:"Ghostbusters",director:"Ivan Reitman"))

    Any类型的数组可以包含任意类型的实例,如本例Any类型的数组things包含一个整数、浮点数、字符串、多元组、类的实例。   

    二  类型嵌套     

         类型嵌套允许你在一种类型中嵌套定义另外一种类型。在另外类型中定义的类型称为嵌套类型,嵌套类型定义在它的支持类型内部。类型能够多级嵌套,嵌套类型内部可以再嵌套定义另外的类型,如下例子所示:

        struct BlackjackCard { 

       // nested Rank enumeration

       enum Rank:Int {

       case Jack, Queen, King, Ace

       // nested Values struct

       struct Values {

               let first:Int,second:Int?

            }

        }   

    }

          使用点语法来存取一个嵌套类型的属性、方法、或下标。

          从嵌套类型的最外一级类型开始,一级级地向内获得要查询的嵌套类型的属性、方法、或下标。

          如下所示:

       let jackSymbol =BlackjackCard.Rank.Jack.toRaw()


  • 相关阅读:
    Apache部署Django项目
    Docker
    常用算法
    Go之基本数据类型
    Go之流程控制
    Go基本使用
    Go安装与Goland破解永久版
    Linux
    详解java中的byte类型
    Linux统计文本中某个字符串出现的次数
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154477.html
Copyright © 2020-2023  润新知