swift2.0 学习笔记Sixteen

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 artist :String

    init(name: String , artist:String) {

        self.artist=artist

        

        super.init(name: name)

    }

}


class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        //类型转换

        //类型转换可以判断实例的类型,也可以将实例看作是父类或者子类的实例

        //swift 中使用is as 操作符实现。这两个操作符提供了一种简单答意的方式去检查值的类型

        let library=[

        Movie(name: "Case", director: "Mich"),

        Song(name: "Blue", artist: "Elvis"),

        Movie(name: "Citizen", director: "Orson"),

        Song(name: "The One", artist: "Chesney"),

        Song(name: "Never", artist: "Rick")

        ]//在幕后library里存储的媒体项依然是MovieSong类型。但是若迭代它,依次取出的实例会是MediaItem类型。

        //用类型检查操作符(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("Media library contains \(movieCount) and \(songCount) songs") //Media library contains 2 and 3 songs

       

        //向下转型

        //某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到他的子类型,用类型转换操作符(as as!)

        //条件形式as 返回一个你试图向下转成的类型的可选值。强制形式as!把试图向下转型和强制解包结果作为一个混合动作。

        //当你不确定向下转型可以成功时,用类型转换的条件形式 as

        //当你可以确定向下转型一定会成功时,才使用强制形式 as

        for item in library{

            if let movie=item as? Movie{

                print("Move:\(movie.name\(movie.director)")

            }else if let song = item as? Song{

                print("Song:\(song.name) \(song.artist)")

            }

        }

//        Move:Case  Mich

//        Song:Blue Elvis

//        Move:Citizen  Orson

//        Song:The One Chesney

//        Song:Never Rick

        

        //AnyAnyObject的类型转换

        //swift为不确定类型提供了两种特殊类型别名

        //AnyObject 可以代表任何class类型的实例

        //Any可以表示任何类型,包括方法类型

        let someObjects:[AnyObject]=[

        Movie(name: "2001", director: "StanleyKubrick"),

        Movie(name: "Moon", director: "Duncan Jones"),

        Movie(name: "Alien", director: "Ridley Scott")

        ]

        //因为知道这个数组只包含Movie实例,可以直接用as!下转并解包到不可选的Movie类型

        for object in someObjects{

            let movie = object as! Movie

            print("Movie:\(movie.name\(movie.director)")

        }

//        Movie:2001  StanleyKubrick

//        Movie:Moon  Duncan Jones

//        Movie:Alien  Ridley Scott

        for movie in someObjects as! [Movie]{

            print("Movie:\(movie.name\(movie.director)")

        }//下转someObjects数组为[Movie]类型来代替下转数组中的每一项

        

        

        //Any类型

        //使用Any类型来和混合的不同类型一起工作,包括方法类型和非class类型。

        var things = [Any]()

        things.append(0)

        things.append(0.0)

        things.append(42)

        things.append(3.1459)

        things.append("hello")

        things.append((3.0,5.0))

        things.append(Movie(name: "DLG", director: "GOD"))

        things.append({(name:String) -> String in return "hello,\(name)"})

        for mything in things{

            switch mything{

            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 positive double value of \(someDouble)")

            case is Double:

                print("some other double value that I do not 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 at \(x),\(y)")

            case let movie as Movie:

                print("a movie called '\(movie.name)', \(movie.director)")

            case let stringConverter as String->String:

                print(stringConverter("DLG"))

            default:

                print("something else")

            }

        }

//        zero as an int

//        zero as a Double

//        An integer value of 42

//        a positive double value of 3.1459

//        a string value of hello

//        an (x,y)point at 3.0,5.0

//        a movie called 'DLG', GOD

//        hello,DLG

        

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值