Swift3.0学习笔记-Type Casting

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值