设为首页 加入收藏

TOP

Swift-----类型转换 、 嵌套类型 、 扩展 、 协议 、 访问控制(一)
2017-10-10 12:17:31 】 浏览:2007
Tags:Swift----- 类型 转换 扩展 协议 访问 控制
1 使用is和as操作符判断和转换数组中的对象类型 1.1 问题 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。在Swift中使用is和as操作符实现类型转换。 本案例定义一个媒体类MediaItem,它有两个子类Movie和Song,创建一个存放Movie实例和Song实例的媒体数组library,使用is和as操作符判断和转化library数组中的实例类型。 1.2 方案 使用类型检查操作符is来检查一个实例是否属于特定子类型,如果属于该子类型操作符返回true,否则返回false。 某类型的一个常量或变量可能实际上属于某一个子类,使用类型转换操作符as可以将其转换成子类型。转换过程可能会失败,因此类型转换操作符有两种不同的形式,可选形式as?和强制形式as。 1.3 步骤 实现此案例需要按照如下步骤进行。 步骤一:定义MediaItem类 首先定义一个MediaItem媒体类,包含一个String类型的name属性,和一个init构造方法,代码如下所示: //媒体类
class MediaItem { var name : String init(name:String){ self.name = name } } 然后定义MediaItem的两个子类,第一个子类Movie在父类的基础上增加一个director属性,和相应的构造方法。第二个子类Song,在父类的基础上增加了一个artist属性,和相应的构造方法,代码如下所示: //电影类
class Movie : MediaItem { var director : String init(name: String, director:String){ self.director = director super.init(name: name) } } //歌曲类
class Song: MediaItem { var airtist : String init(name: String, airtist: String) { self.airtist = airtist super.init(name: name) } } 最后一个创建一个数组常量library,包含两个Movie实例和三个Song实例,library的类型是在它被初始化时根据它数组中包含的内容推断来的,Swift的类型检测能够推断出Movie和Song有共同的父类MediaItem,所以推断出library的类型是MediaItem[],从library中取出的也是MediaItem类型,代码如下所示: //媒体数组
let library /*: [MediaItem]*/ = [ Movie(name: "星际穿越", director: "Daniel"), Song(name: "小苹果", airtist: "筷子兄弟"), Movie(name: "Breaking Bad", director: "Guodh"), Song(name: "最炫民族风", airtist: "凤凰传奇"), Song(name: "菊花台", airtist: "Jay") ] 步骤二:检测类型 定义两个变量movieCount和songCount,用来计算数组library中Movie和Song类型的实例数量。 遍历数组library中的每一个实例,使用is操作符判断类型,代码如下所示: //电影多少部?歌曲多少首
var movieCount = 0 var songCount = 0
//is用于判断引用指向的对象是否是指定类型
for item in library { if item is Movie { movieCount++ }else if item is Song { songCount++ } } movieCount songCount 运行结果如图-1所示: 图-1 步骤三:转换类型 遍历library里的每一个MediaItem实例,并打印出适当的描述,item需要真正作为Movie或Song的类型来使用,这是需要使用as操作符进行类型转换,代码如下所示: //遍历每个媒体,并打印详细信息
for item in library { if item is Movie { //as用于强制装换,能转就转,不能转的话程序直接崩溃
let movie = item as! Movie println("电影名:\(movie.name),导演:\(movie.director)") }else if item is Song { let song = item as! Song println("歌曲名:\(song.name), 演唱者:\(song.airtist)") } } 但是数组中的每一个item可能是Movie或Song,所以这里使用可选类型的转换符更合适,代码如下所示: for item in library { //as?与as功能相同,能转就转,不能转返回nil,程序不会崩溃,返回的是一个可选值
if let movie = item as? Movie { println("电影名:\(movie.name),导演:\(movie.director)") } else if let song = item as? Song { println("歌曲名:\(song.name), 演唱者:\(song.airtist)") } } 1.4 完整代码 本案例中,完整代码如下所示: import UIKit //媒体类
class MediaItem { var name : String init(name:String){ self.name = name } } //电影类
class Movie : MediaItem { var director : String init(name: String, director:String){ self.director = director super.init(name: name) } } //歌曲类
class Song: MediaItem { var airtist : String init(name: String, airtist: String) { self.airtist = airtist super.init(name: name) } } //媒体数组
let library /*: [MediaItem]*/ = [ Movie(name: "星际穿越", director: "Daniel"), Song(name: "小苹果", airtist: "筷子兄弟"), Movie(name: "Breaking Bad", director: "Guodh"), Song(name: "最炫民族风", airtist: "凤凰传奇"), Song(name: "菊花台", airtist: "Jay") ] //电影多少部?歌曲多少首
var movieCount = 0 var songCount = 0
//is用于判断引用指向的对象是否是指定类型
for item i
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇CocoaPods的安装和使用那些事(Xc.. 下一篇Swift语法笔记

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目