swift2.0学习之类型转换

swift2.0学习之类型转换,第1张

概述  (一)类型转换(type casting) 类型转换是检查类型实例的方式,也是把类型实例作为子类或者父类的方式 主要有三个关键词,is,as?,as!(as),is表示是某种类型(比如父类和子类同时出现,选择父类,就是表示层级比较大的那个类型),as表示的是向下转换(downcast)到子类本身,问号表示可选,叹号表示强拆包 举个例子: class MediaItem { var na

(一)类型转换(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" >        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: "夕阳醉了",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),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")                            }        }
总结

以上是内存溢出为你收集整理的swift2.0学习之类型转换全部内容,希望文章能够帮你解决swift2.0学习之类型转换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1085807.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存