类型转换在 Swift 中使用 is 和 as ,分别提供了一种方式去检查值的类型或者转换它的类型。

为类型转换定义类层次

将类型转换用在类和子类的层次结构上,检查特定类实例的类型并且转换这个类实例的类型成为这个层次结构中的其他类型.

class MediaItem {var name: Stringinit(name: String) {self.name = name}
}
class Movie: MediaItem {var director: Stringinit(name: String, director: String) {self.director = directorsuper.init(name: name)}
}
class Song: MediaItem {var artist: Stringinit(name: String, artist: String) {self.artist = artistsuper.init(name: name)}
}
let library = [Movie(name: "Casablanca", director: "Michael Curtiz"),Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),Movie(name: "Citizen Kane", director: "Orson Welles"),Song(name: "The One And Only", artist: "Chesney Hawkes"),Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
print(type(of: library))    //Array<MediaItem>
检查类型

用类型检查操作符(is)来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false。

class MediaItem {var name: Stringinit(name: String) {self.name = name}
}
class Movie: MediaItem {var director: Stringinit(name: String, director: String) {self.director = directorsuper.init(name: name)}
}
class Song: MediaItem {var artist: Stringinit(name: String, artist: String) {self.artist = artistsuper.init(name: name)}
}
let library = [Movie(name: "Casablanca", director: "Michael Curtiz"),Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),Movie(name: "Citizen Kane", director: "Orson Welles"),Song(name: "The One And Only", artist: "Chesney Hawkes"),Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
var movieCount = 0
var songCount = 0
for item in library{if item  is Movie {movieCount += 1}else if item is Song {songCount += 1}
}
print("Media library contains \(movieCount) movies and \(songCount) songs") //Media library contains 2 movies and 3 songs
向下转型

某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试用类型转换操作符(as? 或 as!)向下转到它的子类型。
因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式 as? 返回一个试图向下转成的类型的可选值。强制形式 as! 把试图向下转型和强制解包转换结果结合为一个操作。

for item in library {if let movie = item as? Movie {print("Movie: \(movie.name), dir. \(movie.director)")} else if let song = item as? Song {print("Song: \(song.name), by \(song.artist)")}
}
//Movie: Casablanca, dir. Michael Curtiz
//Song: Blue Suede Shoes, by Elvis Presley
//Movie: Citizen Kane, dir. Orson Welles
//Song: The One And Only, by Chesney Hawkes
//Song: Never Gonna Give You Up, by Rick Astley
Any 和 AnyObject 的类型转换

不确定类型特殊的类型别名:
1.Any 可以表示任何类型,包括函数类型。
2.AnyObject 可以表示任何类类型的实例。

var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things.append({ (name: String) -> String in "Hello, \(name)" })
for thing in things {switch thing {case 0 as Int:print("zero as an Int")case 0 as Double:print("zero as a Double")case let someInt as Int:print("an integer value of \(someInt)")case let someDouble as Double where someDouble > 0:print("a positive double value of \(someDouble)")case is Double:print("some other double value that I don't want to print")case let someString as String:print("a string value of \"\(someString)\"")case let (x, y) as (Double, Double):print("an (x, y) point at \(x), \(y)")case let movie as Movie:print("a movie called \(movie.name), dir. \(movie.director)")case let stringConverter as (String) -> String:print(stringConverter("Michael"))default:print("something else")}
}
//zero as an Int
//zero as a Double
//an integer value of 42
//a positive double value of 3.14159
//a string value of "hello"
//an (x, y) point at 3.0, 5.0
//a movie called Ghostbusters, dir. Ivan Reitman
//Hello, Michael

Any 类型可以表示所有类型的值,包括可选类型。

let optionalNumber: Int? = 3
things.append(optionalNumber)        // 警告
things.append(optionalNumber as Any) // 没有警告

嵌套类型:
嵌套类型,可以在支持的类型中定义嵌套的枚举、类和结构体。
要在一个类型中嵌套另一个类型,将嵌套类型的定义写在其外部类型的 {} 内,而且可以根据需要定义多级嵌套。

//嵌套类型
struct BlackjackCard {enum Suit: Character {//嵌套Suit枚举  扑克牌四种花色,花色符号case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"}//嵌套 Rank 枚举 描述扑克牌从Ace~10,J,Q,Kenum Rank: Int {case two = 2, three, four, five, six, seven, eight, nine, tencase jack, queen, king, acestruct Values {let first: Int,second: Int?}var values: Values{switch self {case .ace:return Values(first: 1, second: 11)case .jack, .queen, .king:return Values(first: 10, second: nil)default:return Values(first: self.rawValue, second: nil)}}}let rank: Rank, suit: Suitvar description: String {var output = "suit is \(suit.rawValue),"output += "value is \(rank.values.first)"if let second = rank.values.second {output += "or\(second)"}return output}
}
let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("The AceOfSpades: \(theAceOfSpades.description)")   //TheAceOfSpades: suit is ♠,value is 1or11
引用嵌套类型
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue    //红心符号为“♡“

swift基础day6---类型转换、嵌套类型相关推荐

  1. 2个字符串相等 swift_Swift快速入门(一)之 Swift基础语法

    Swift快速入门(一)之 Swift基础语法 近期重新学习了一遍Swift语言,主要以<Swift编程权威指南(第2版)>为教程,学习过程中结合比对Java语言特性将学习心得作为三篇笔记 ...

  2. IOS开发语言Swift入门连载---类型转换

    IOS开发语言Swift入门连载-类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 类型转换在 Swift 中使用is 和 as 操作符实现.这两个操作符提供了一种简单达 ...

  3. Swift基础 - - 高德地图实践

    高德地图开发需要自己到官网http://lbs.amap.com/console/ 注册一个ak,新建一个swift工程,然后在Info.plist中添加一个NSLocationAlwaysUsage ...

  4. Java基础day6

    Java基础day6 Java基础day6 debug和基础练习 1 debug模式 1.1 什么是debug模式 1.2 debug模式操作 2 基础练习 2.2.1 减肥计划if版本 2.2.2 ...

  5. Swift基础--方法

    Swift基础--方法 swift中方法分为实例方法和静态方法,方法时于默写特定类型相关联的函数.类,结构体,枚举都可以定义实例方法,也可以定义静态方法. 一,实例方法 实例方法: 给特定类型实例封装 ...

  6. Python基础-数据类型转换,默认参数,关键字参数

    Python基础-数据类型转换,文件操作,默认参数,关键字参数 1.数据类型之间转换 """ 数字型:int float bool compex 非数字型:list tu ...

  7. Swift基础——数组Array

    Swift基础--数组Array 数组:使用有序列表存储同一类型的多个值,相同值可出现在一个数组的不同位置. 数组简介 首先,和String一样我们也来看看他的一些Api方法 常规操作方法 rever ...

  8. Swift基础入门知识学习(12)-枚举(列举)-讲给你懂

    TED演讲的8个秘诀:学习18分钟高效表达-重点笔记 Swift基础入门知识学习(11-2)-閉包-第二篇-讲给你懂 目录 枚举(列举)语法 使用 Switch 语句匹配枚举(列举)值 相关值 原始值 ...

  9. Swift基础语法学习笔记(1)

    Swift基础语法的学习 1.HashMap 2.for-in循环控制 3.??聚合运算 4.SwiftUI的一些小技巧 5.init初始化器 6.@propertyWrapper属性包装器 音乐评分 ...

  10. 从零开始的iOS开发:00 | Swift基础语法(上)

    目录 一.开发环境 二.关于Swift (一)Swift简介 (二)Swift特性 (三)结语 三.Swift基础语法 (一)编程准备 (二)Hello,world! (三)简单值 1.变量与常量 2 ...

最新文章

  1. C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()
  2. 论文翻译_论文翻译的注意事项有什么?
  3. @ConfigurationProperties与@Value的区别
  4. 工业界推荐系统实用分析技巧
  5. 链表常见面试题二:约瑟夫环
  6. rabbitmq如何保证消息不丢失_RabbitMQ的去重与防止消息的丢失
  7. jQuery banner切换插件
  8. 你知道304吗?图解强缓存和协商缓存
  9. java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成
  10. MapReduce之join操作
  11. java面向对象(第一章课后作业)02
  12. 2022爱分析·国央企数字化实践报告
  13. Plain Road
  14. 2013菏泽国际牡丹文化旅游节
  15. 携程网机票查询token参数的生成过程
  16. C#蓝牙链接+传输文件
  17. 融跃教育登陆湖南卫视!揭秘融跃是个什么样机构!CFA/FRM/ACCA
  18. 什么是原型、原型链、组合继承?
  19. Hexo + Next 主题实现全局播放背景音乐
  20. 计算机自带游戏怎么调,如何设置电脑游戏全屏?

热门文章

  1. oss批量上传工具_使用oss批量上传图片
  2. 关于单双向晶闸管的控制电路
  3. Android WifiDirect
  4. ExtJS4.2初识
  5. VScode调试中出现“没有可用的调试程序,无法发送‘variables’“问题
  6. 【宋词】之《破阵子·为陈同甫赋壮词以寄之》
  7. ChinaJoy直击:咪咕圈圈引领Z世代国潮新风
  8. 健身最好的办法:芭蕾和体操
  9. 直线检测之LSD算法及其OpenCV/C++案例实现
  10. 微电子学与计算机 投稿格式,微电子学与计算机杂志投稿须知,编辑部最新刊期投稿格式...