Swift从入门到精通第十五篇 - 类型转换 初识
2024-09-01 07:03:06
类型转换(学习笔记)
环境Xcode 11.0 beta4 swift 5.1
类型转换
- 类型转换是检查实例类型的一种方法,或者检查来自类层级不同的父类或子类一个实例,用
is
和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"),
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")
]
// "library" 类型编译器自动推导为: [MediaItem]
- 示例
类型检查
- 示例
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")
// Prints "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
类型转换Swift
为非指定类型提供了两种特殊类型Any
可以代表实例类型,包括函数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
值,那么要用as
操作符显示的将类型转换为Any
let optionalNumber: Int? = 3
things.append(optionalNumber) // Warning
things.append(optionalNumber as Any) // No warning
- 如果你想用可选值作为
最新文章
- Qt 中使用Singleton模式需小心
- OD调试篇12
- PHP 500 -Invalid command RewriteEngine的解决
- Android启动组件的三种主流及若干非主流方式
- js 触摸类库
- Linux中的MyEclipse配置Hadoop
- iOS在Cocoa Touch Static Library使用CocoaPods
- climit 头文件的内容
- 分享一个markdownpad2的授权key
- QT 创建一个具有复选功能的下拉列表控件
- 剑指Offer——完美+今日头条笔试题+知识点总结
- Guava新增集合类型-Bimap
- 转 cxgrid属性说明
- 前端测试框架jest 简介
- 微信端支付宝支付,iframe改造,解决微信中无法使用支付宝付款和弹出“长按地址在浏览器中打开”
- 约合¥1720 LG法国称G Watch将于6月开卖
- LeetCode: Multiply Strings 解题报告
- BZOJ 3572 【HNOI2014】 世界树
- 238. Product of Array Except Self(对O(n)和递归又有了新的理解)
- Spring: J2EE框架
热门文章
- 图数据库 Nebula Graph 的数据模型和系统架构设计
- Python之变量、常量以及注释
- Oracle数据库之四 简单查询
- Liunx学习总结(五)--包管理
- 微信小程序 es6-promise.js封装请求 处理异步进程
- 百度地图小Demo---获取当前地址以及拖拽显示地址
- GCN和GCN在文本分类中应用
- webpack.config.js配置实例
- 你真的了解MyBatis中${}和#{}的区别吗?
- Codefroces 366 D Dima and Trap Graph (最短路)