swift2.0学习之类型转换

前端之家收集整理的这篇文章主要介绍了swift2.0学习之类型转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

(一)类型转换(type casting)

类型转换是检查类型实例的方式,也是把类型实例作为子类或者父类的方式

主要有三个关键词,is,as?,as!(as),is表示是某种类型(比如父类和子类同时出现,选择父类,就是表示层级比较大的那个类型),as表示的是向下转换(downcast)到子类本身,问号表示可选,叹号表示强拆包

举个例子:

  1. class MediaItem {
  2. var name: String
  3. init(name: String) {
  4. self.name = name
  5. }
  6. }
  7.  
  8. class Movie: MediaItem {
  9. var director: String
  10. init(name: String,director: String) {
  11. self.director = director
  12. super.init(name: name)
  13. }
  14. }
  15. <pre name="code" class="plain"> for item in library {
  16. if let movie = item as? Movie {
  17. print("name:\(movie.name),director:\(movie.director)")
  18. }else if let song = item as? Song {
  19. print("name:\(song.name),artist:\(song.artist)")
  20. }
  21. }

class Song: MediaItem { var artist: String init(name: String,artist: String) { self.artist = artist super.init(name: name) }}
  1.  

  1. let library = [Movie(name: "张学友",director: "麦兆辉"),Song(name: "一路上有你",artist: "张学友"),Movie(name: "周星驰",director: "周星驰"),Song(name: "夕阳醉了",Movie(name: "赌神",director: "王晶")]
  2. for item in library {
  3. if item is Movie {
  4. movieCount++
  5. }else if item is Song {
  6. songCount++
  7. }
  8. }
  9. print("Media library contains \(movieCount) movies and \(songCount) songs")

解释:

如果当前的MediaItem(item)是Movie的实例的话,就返回true,否则就返回false

而上面的item实际上是MediaItem类型,而不是真正的Movie类型,也就说你访问不到Movie的director的属性,那我们怎么才能让item实例真正是Movie本身的类型呢?这时我们就用到关键字as了,进行向下拆包

as有两种形式,一个是as?,表示返回的类型可选,一个是as!强制拆包,用这个的时候你要确保你解析的东西是正确有值的,可以解包成功的

  1. for item in library {
  2. if let movie = item as? Movie {
  3. print("name:\(movie.name),artist:\(song.artist)")
  4. }
  5. }

因为item是MediaItem的实例,向下可能是Movie的实例,所以用as?可选,再用一个可选绑定,如果成功,就可以访问director属性

注意:转换实际上没有改变这个实例或者它的值,潜在的实例还是保持原来的值,它仅仅是被转换的类型的实例

(二)Any和AnyObject

AnyObject:代表任意类类型(class type)的实例

Any:可以代表任意类型的实例,除了函数类型

a.AnyObject

  1. let someObjects: [AnyObject] = [Movie(name: "大圣归来",director: "未知"),Movie(name: "速度与激情7",director: "温世仁"),Movie(name: "无间道",director: "刘伟强")]
  2. for item in someObjects {
  3. let movie = item as! Movie
  4. print("name: \(movie.name),dir.\(movie.director)")
  5. }

这里你已经确定item就是Movie的实例类型,直接强拆,用一个常量接收

还有一个办法,就是既然你已经确定someObjects是一个[Movie]类型的数组,那么就可以这么写:

  1. for movie in someObjects as! [Movie] {
  2. print("name: \(movie.name),dir.\(movie.director)")
  3. }

b.Any

既然Any除了函数类型都能代表,那么我们就定义一个可变数组,Any型的,装它几种类型

  1. var things = [Any]()
  2. things.append(0)
  3. things.append(0.0)
  4. things.append(42)
  5. things.append(3.14159)
  6. things.append("hell0")
  7. things.append((3.0,5.0))
  8. things.append(Movie(name: "恐怖游轮",director: "未知"))
  9. things.append({ (name: String) -> String in ("Hello,\(name)") })
  10. for thing in things {
  11. switch thing {
  12. case 0 as Int:
  13. print("zero as an Int")
  14. case 0 as Double:
  15. print("zero as a Double")
  16. case let someInt as Int:
  17. print("an integer value of \(someInt)")
  18. case let someDouble as Double where someDouble > 0:
  19. print("a double value of \(someDouble)")
  20. case is Double:
  21. print("some other double that I don't want to print")
  22. case let someString as String:
  23. print("a string value of \(someString)")
  24. case let (x,y) as (Double,Double):
  25. print("an (x,y) point is at \(x,y)")
  26. case let movie as Movie:
  27. print("a movie called \(movie.name),dir.\(movie.director)")
  28. case let stringConverter as String -> String:
  29. print(stringConverter("xiaoyu"))
  30. default:
  31. print("something else")
  32. }
  33. }

猜你在找的Swift相关文章