Swift3.0学习笔记-Type Casting
来源:互联网 发布:西安企业预算软件 编辑:程序博客网 时间:2024/05/19 10:40
https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-ID338
基类:
class MediaItem { var name: String init(name: String) { self.name = name }}2个MediaItem的派生类(注意:在Swift中先初始化派生类的成员变量,然后再执行父类的构造函数):
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")]
if library is [MediaItem] { print("library's type is [MediaItem]")}输出: library's type is [MediaItem]说明: library数组相当于[MediaItem]类型的数组。
上面提到了is关键字的用法, 跟Java的instanceof完全一样。 请注意is关键字不仅在判断当前类返回true,所有的父类也同样返回true。参看示例代码:
var song = Song(name: "zhangsan", artist: "zhuanji")if song is MediaItem { print("song is inherit by MediaItem")}if song is Song { print("song is object of Song")}输出:
song is inherit by MediaItem
song is object of Song
Swift提供了as?和as!作为类型强转的操作符, 用法类似于try?和try!。
as?是可选类型,如果对象属于这个类那么强转为对应的引用,否则返回nil。
as!是强制类型转换,如果转换失败则会出现运行时错误。
var objSong = Song(name: "li", artist: "wu")if let param = objSong as? Song { print("objSong is from Song")}if let param = objSong as? Movie { print("objSong is from Movie")}if let param = objSong as? MediaItem { print("objSong is from MediaItem")}输出:
objSong is from Song
objSong is from MediaItem
do { try objSong as! Movie} catch { print("objSong is not from Movie")}前面提到as!如果转换失败时会导致运行时错误, 而且捕获不到异常。 即使像上面这样写仍然会出现运行时错误!
Swift提供了2种通用数据类型, 作用类似于Java的Object和OC的NSObject。
Any: 可以指向所有的数据类型,甚至包含函数类型;
AnyObject:可以指向所有的类对象;
var things = [Any]() things.append(0)things.append(0.0)things.append(42)things.append(3.14159)things是可以插入所有数据类型的数组。
Swift还提供关键字as,作用类似于is,即判断数据类型。示例代码:
for thing in things { switch thing { case 0 as Int: //可理解成“作为整型的数值0” print("zero as an Int") case 0 as Double: //“作为浮点型的数值0” print("zero as a Double") case let someInt as Int: print("an integer value of \(someInt)") default: print("something else") }}输出:
// zero as an Int// zero as a Double// an integer value of 42
类似于捕获崩溃的try、try?和try!, 类型转换操作符是as、as?和as!;二者逻辑是一样的,问号表示可选数据类型,感叹号表示强制执行。
小结:
1、Swift使用is判断属于某个类, 作用同Java的instanceof;
2、Swift使用Any表示所有数据类型、AnyObject表示所有类对象类型;类似于Java的Oject和OC的NSObject。
3、使用as?和as!做数据类型强转,as用于判断是否某个数据类型。
4、as和is关键字的作用有点像,但不能相互替代。 is可用于if判断条件中, as可理解为“作为**数据类型”并且多用于switch/case中。
- Swift3.0学习笔记-Type Casting
- Type Casting
- Type Casting
- Type Casting
- Type Casting
- Type Casting
- Swift3.0学习笔记-Functions
- Swift3.0学习笔记-Closures
- Swift3.0学习笔记-Initialization
- Swift3.0学习笔记-DeInitialization
- Swift3.0学习笔记-Extensions
- Swift3.0学习笔记-Protocols
- Swift3.0学习笔记-Generics
- Swift3.0 URLSession学习笔记
- Swift3.0 URLSession学习笔记
- Swift3.0学习笔记-Extensions
- Swift学习笔记18——嵌套类型(Nested Types)和类型转换(Type Casting)
- Swift3.0学习笔记(一)
- 人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码
- 微软再发力,宣布开源JDBC
- Linux常用命令-文件处理
- 详解Linux bash变量
- 在win7下python的xlrd和xlwt的安装于应用
- Swift3.0学习笔记-Type Casting
- 《CLR via C#》读书笔记-异步编程(二)
- OpenCV学习笔记(二):OpenCV3.0 AKAZE特征检测与显示
- Java并发编程与技术内幕:Callable、Future、FutureTask、CompletionService
- bzoj 4066: 简单题
- 大小端模式及其判断
- 【备注】【C17】《Spring实战(第4版)》PDF 下载
- docker 常用命令
- 多线程精华集萃