Swift学习笔记-类型转换
Posted 宇仔TuT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift学习笔记-类型转换相关的知识,希望对你有一定的参考价值。
类型转换的作用
类型转换可以判断
实例的类型,也可以将该实例在其所在的类层次中视为
其父类
或子类
的实例。
Swift 中类型转换的实现为 is
和 as
操作符。这两个操作符使用了一种简单传神的方式来检查
一个值的类型或将某个值转换
为另一种类型。
你还可以使用类型转换
来检查
类型是否遵循
某个协议。
类型检查
使用类型检查操作符 is
来检查一个实例
是否属于一个特定的子类
。如果实例是该子类类型,类型检查操作符返回true
,否则返回 false
。
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!
,则将向下类型转换
和强制展开
结合为一个步骤。
怎么区分使用as?还是as!
当不确定
向下转换类型是否能够成功,请使用条件形式
的类型转换操作符 as?
。如果向下转换失败
,可选值为nil
。
确信
向下转换类型会成功时,使用强制形式的类型转换操作符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*
举个例子
if let movie = item as? Movie
这个写法可以读作:尝试以 Movie
类型访问 item
。如果成功,设置一个新的临时常量 movie
储存返回的可选 Movie
类型 。
类型转换实际上不会改变实例及修改其值。
Any 和 AnyObject 的类型转换
Swift
为不确定
的类型提供了两种特殊的类型别名
:
AnyObject
可以表示任何类
类型的实例。Any
可以表示任何
类型,包括函数类型
。
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)” )
你可以在 switch
结构的 case
中使用 is
和 as
操作符找出已知 Any
或 AnyObject
类型的常量或变量的具体类型
。
for thing in things
switch thing
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”)
default:
print(“something else”)
optional类型转换为Any来避免警告
如果你给显式声明的Any类型使用可选项,Swift 就会发出警告 意思是本来应该传入一个Any
类型的实参
,但你传了一个optional类型
的实参,就会报warning。
如果你真心需要在Any
值中使用optional类型
,可以通过as
运算符来显式地将optional类型
转换为Any类型
来消除警告。
let optionalNumber: Int? = 3
things.append(optionalNumber) *// Warning*
things.append(optionalNumber as Any) *// No warning*
Swift学习群
欢迎加入本人的Swift学习微信群,一同互相监督学习,我微信:reese90
以上是关于Swift学习笔记-类型转换的主要内容,如果未能解决你的问题,请参考以下文章
《从零开始学Swift》学习笔记(Day48)——类型检查与转换
《从零開始学Swift》学习笔记(Day48)——类型检查与转换
《从零开始学Swift》学习笔记(Day 50)——扩展计算属性方法
《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?