Swift(十九、类型转换&嵌套类型)


1、Swift入门学习笔记(第一版),对Swift的基础知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~

2、在学习完基本的知识点以后会结合官方文档及相关资料,在此版本的基础上进行添加更改。


十九、类型转换&嵌套类型


一、类型转换


可以判断实例的类型,也可将实例看做是其父类或者子类的实例
Swift中使用isas操作符实现


以下面的实例为例子

class MediaItem {
    func testPrint() {
        print("MediaItem")
    }
}

class Movie:MediaItem {
    override func testPrint() {
        print("Movie")
    }
}

class Song:MediaItem {
    override func testPrint() {
        print("Song")
    }
}

创建一个library数组

let library = [Movie(),Song(),Song(),Movie(),Movie()]

library存储的是MovieSong类型,但是若要迭代它,取出的实例为MediaItem类型。为了让其作为原有类型工作可以检查类型或者向下转换成其他类型


1、检查类型

is检查一个实例是否属于特定类型(子类型),是返回true,否则返回false

var movieCount = 0
var songCount  = 0
for item in library {
    if item is Movie {
        ++movieCount
    } else if item is Song {
        ++songCount
    }
}
print("Movie:\(movieCount),Song:\(songCount)")

Output:

Movie:3,Song:2

如果把Movie改成MediaItem那么结果会是5,0,可见在迭代(for-in循环)时,是以下一个MediaItem的形式迭代,然后检查是不是其子类的实例


2、向下转型

有时候常量或变量实际属于一个子类,可以向下转到它的子类型,用as?as!

as?:条件形式,返回一个你试图向下转成的类型的可选值。不确定是否能转型成功时用
as!:强制类型,把试图向下转型和强制解包结果作为一个混合动作。确定一定会成功时用,但是转型错误会触发错误

前面已经说了上述例子在迭代时是以MediaItem类迭代的,这里我们向下转型

for item in library {
    if let movie = item as? Movie {
        movie.testPrint()
    } else if let song = item as? Song {
        song.testPrint()
    }
}

Output:

Movie
Song
Song
Movie
Movie

注意:转换没有真的改变实例或者它的值。潜在的根本的实例保持不变,只是简单地把它被转换成的类来使用


3、Any和AnyObject的类型转换

AnyObject:任何class类型的实例
Any:可表示任何类型,包括方法实例,闭包等

这个虽然好用,但是代码中还是有明确类型最好

var testAny = [Any]()

testAny.append(2.18)
testAny.append((2.0,2.18))
testAny.append("Hello")
testAny.append(Movie())
testAny.append({(name:String)->String in
    return "Hello \(name)"})

各种类型都OK,包括方法类型和非class类型,闭包也是可以的等等,上面的Movie是实例不是class




二、嵌套类型


类,枚举,结构体之间可以相互嵌套
嵌套类型的引用点语法即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值