一 类型检查

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 as? Movie {
       println("Movie: '\(movie.name)', dir. \(movie.director)")
    }else if let song =item as? Song {
       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()





一 类型检查

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 as? Movie {
       println("Movie: '\(movie.name)', dir. \(movie.director)")
    }else if let song =item as? Song {
       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()