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


        类型转换包括判断对象的基类和将基类引用转换为派生类引用。 Swift使用is判断当前对象是否为某个类的对象, 作用同Java的instanceof关键字; Swift使用as作为强转操作符, 将基类引用转换为派生类引用。

基类:

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


如果将as?改成as!会怎样?

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中。


0 0
原创粉丝点击