swift2.0学习之类型转换

(一)类型转换(type casting)

类型转换是检查类型实例的方式,也是把类型实例作为子类或者父类的方式

主要有三个关键词,is,as?,as!(as),is表示是某种类型(比如父类和子类同时出现,选择父类,就是表示层级比较大的那个类型),as表示的是向下转换(downcast)到子类本身,问号表示可选,叹号表示强拆包

举个例子:

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)
    }
}
<pre name="code" class="plain">        for item in library {

            if let movie = item as? Movie {
                print("name:\(movie.name), director:\(movie.director)")
            }else if let song = item as? Song {
                print("name:\(song.name), artist:\(song.artist)")
            }
        }

class Song: MediaItem { var artist: String init(name: String, artist: String) { self.artist = artist super.init(name: name) }}


        let library = [Movie(name: "张学友", director: "麦兆辉"),Song(name: "一路上有你", artist: "张学友"),Movie(name: "周星驰", director: "周星驰"),Song(name: "夕阳醉了", artist: "张学友"),Movie(name: "赌神", director: "王晶")]
        for item in library {

            if item is Movie {
                movieCount++
            }else if item is Song {
                songCount++
            }

        }

        print("Media library contains \(movieCount) movies and \(songCount) songs")

解释:

如果当前的MediaItem(item)是Movie的实例的话,就返回true,否则就返回false

而上面的item实际上是MediaItem类型,而不是真正的Movie类型,也就说你访问不到Movie的director的属性,那我们怎么才能让item实例真正是Movie本身的类型呢?这时我们就用到关键字as了,进行向下拆包

as有两种形式,一个是as?,表示返回的类型可选,一个是as!强制拆包,用这个的时候你要确保你解析的东西是正确有值的,可以解包成功的

        for item in library {

            if let movie = item as? Movie {
                print("name:\(movie.name), director:\(movie.director)")
            }else if let song = item as? Song {
                print("name:\(song.name), artist:\(song.artist)")
            }
        }

因为item是MediaItem的实例,向下可能是Movie的实例,所以用as?可选,再用一个可选绑定,如果成功,就可以访问director属性了

注意:转换实际上没有改变这个实例或者它的值,潜在的实例还是保持原来的值,它仅仅是被转换的类型的实例

(二)Any和AnyObject

AnyObject:代表任意类类型(class type)的实例

Any:可以代表任意类型的实例,除了函数类型

a.AnyObject

        let someObjects: [AnyObject] = [Movie(name: "大圣归来", director: "未知"), Movie(name: "速度与激情7", director: "温世仁"), Movie(name: "无间道", director: "刘伟强")]

        for item in someObjects {

            let movie = item as! Movie
            print("name: \(movie.name),dir.\(movie.director)")
        }

这里你已经确定item就是Movie的实例类型,直接强拆,用一个常量接收

还有一个办法,就是既然你已经确定someObjects是一个[Movie]类型的数组,那么就可以这么写:

        for movie in someObjects as! [Movie] {

            print("name: \(movie.name),dir.\(movie.director)")
        }

b.Any

既然Any除了函数类型都能代表,那么我们就定义一个可变数组,Any型的,装它几种类型

        var things = [Any]()
        things.append(0)
        things.append(0.0)
        things.append(42)
        things.append(3.14159)
        things.append("hell0")
        things.append((3.0, 5.0))
        things.append(Movie(name: "恐怖游轮", director: "未知"))
        things.append({ (name: String) -> String in ("Hello, \(name)") })
        for thing in things {

            switch thing {
            case 0 as Int:
                print("zero as an Int")
            case 0 as Double:
                print("zero as a Double")
            case let someInt as Int:
                print("an integer value of \(someInt)")
            case let someDouble as Double where someDouble > 0:
                print("a double value of \(someDouble)")
            case is Double:
                print("some other double that I don't want to print")
            case let someString as String:
                print("a string value of \(someString)")
            case let (x, y) as (Double, Double):
                print("an (x, y) point is at \(x, y)")
            case let movie as Movie:
                print("a movie called \(movie.name),dir.\(movie.director)")
            case let stringConverter as String -> String:
                print(stringConverter("xiaoyu"))
            default:
                print("something else")

            }
        }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 09:04:00

swift2.0学习之类型转换的相关文章

swift2.0学习之拓展

拓展:和oc的拓展方法功能差不多,就是给已经存在的类,结构体,枚举,协议类型增加新的方法 拓展语法: 用extension关键字声明: extension SomeType { // new functionality to add to SomeType goes here } 拓展可以: (1)添加计算型属性和计算属性 (2)提供新的构造器 (3)定义实例方法和类型方法 (4)定义下标 (5)定义和使用嵌套类型 (一)计算型属性 extension Double { var km: Doub

swift2.0学习之类型方法(类方法)

和oc类似,就是通过类本身调用方法,在方法(func)关键字前面用static修饰,如果父类允许子类重载方法,就用关键字class修饰 另外,在swift中你可以为类,结构体,枚举定义类方法,而不像oc,只可以类定义类方法 通过点语法调用类方法,下面举例子说明 首先我们规定一个游戏,可以记录玩家的名字,和玩家的等级(这里就需要一个类型属性),当玩家完成一个等级后,就解锁下一个等级,(这里要判断传进来的等级和玩家完成的最高等级),玩家就用类来表示创建,等级的事用结构体创建 struct Level

(IOS)Swift2.0 Radio 程序分析

本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源项目Swift Radio的研究心得. 项目地址:https://github.com/swiftcodex/Swift-Radio-Pro 一.界面 在这个项目中一共包含了6个界面控制器,其中包含了5个用于分别显示电台频道(Swift Radio).正在播放(Now Playing View).电台信息(Info View Controller).app信息(Menu View Controller)和app特征及联系邮箱

窥探Swift2.0之需要注意的基本运算符和高级运算符

之前更新了一段时间有关Swift语言的博客,连续更新了有6.7篇的样子.期间间更新了一些iOS开发中SQLite.CollectionViewController以及ReactiveCocoa的一些东西.时隔两月,还得继续更新Swift语言的东西不是.在去年翻译<Swift编程入门经典>(Swift1.0版本,基于Xcode6)这本书时,系统的搞了搞Swift语言,接下来的一段时间内打算持续更新一下相关Swift语言的一些东西, 不过现在已经是Swift2.0版本了,区别还是不小的.并且目前在

swift2.0语言新特性

更多文章关注小编的博客www.goofyy.com/bolg/ 传送门: goofyy技术宅 swift语言是苹果公司在2014年WWDC开发者大会上推出的新的开发语言,时至一年,swift经历了几番变更,在2015年的新过去的开发者的会上,苹果推出swift正式版2.0.并在2015年年底开放源代码,不得不说,这是一件很碉碉的事,其实swift开源的意义对于开发者来讲,主要是可以在更多地平台上面使用swift开发语言开发应用,不得不说,苹果公司也是放了一个大招. 小编也斗胆把自己当做swift

关东升的《Swift2.0》(暂定名)即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我将在11月左右出版,<Swift2.0>(暂定名) ,<Swift2.0>将在<Swift开发指南>第1版的基础上添加Swift2.0的内容,同时摒弃第1版的一些不合理的内容,使得本书更加适合Swift开发者.我将连续发一些Swift2.0的学习笔记,有兴趣者,可以看一下. 附<Swift2.0>(暂定名)此书目录: 1 本书约定 2 第一个Swift

iOS开发——学习总结swift篇&amp;swift 2.0学习与总结一

swift 2.0学习与总结一 一:属性策略(OC中的叫法) strong: 在Swift中是默认的 weak: 通过weak关键词申明 weak var delegate: UITextFieldDelegate? readonly,readwrie 直接通过声明变量var,声明常量let的方式来指明 copy 通过@NSCopying指令声明. 值 得注意的是String,Array和Dictionary在Swift是以值类型(value type)而不是引用类型(reference typ

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni

一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity