对照Java学习Swift--类型转换(Type Casting)

来源:互联网 发布:整型数据的表示范围 编辑:程序博客网 时间:2024/05/22 05:01

类型转换在Java和Swift中非常的相似,这个一般都是在类中, 可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。也可以用它来检查一个类型是否实现了某个协议,协议相当于Java中的接口。

检查类型(Checking Type)

用类型检查操作符(is)来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false。Java中使用instanceof关键字来类型检查。
swift:

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

Java:

        if(item instanceof Movie) {            ++movieCount        } else if(item instanceof Song) {            ++songCount        }

向下转型(Downcasting)

某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到它的子类型,用类型转换操作符(as? 或 as!)。
因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式(conditional form)as? 返回一个你试图向下转成的类型的可选值(optional value)。强制形式 as! 把试图向下转型和强制解包(force-unwraps)转换结果结合为一个操作。

当你不确定向下转型可以成功时,用类型转换的条件形式(as?)。条件形式的类型转换总是返回一个可选值(optional value),并且若下转是不可能的,可选值将是 nil。这使你能够检查向下转型是否成功。

只有你可以确定向下转型一定会成功时,才使用强制形式(as!)。当你试图向下转型为一个不正确的类型时,强制形式的类型转换会触发一个运行时错误。
swift:

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

Java:

Movie movie = ((Movie)item)

很像吧。

Any 和 AnyObject 的类型转换

Swift 为不确定类型提供了两种特殊的类型别名:

  • AnyObject 可以表示任何类类型的实例。
  • Any 可以表示任何类型,包括函数类型。

Java中所有类都是Object类的子类,所以Object可以表示任何类型的实例,包括函数类型,不区分类类型和其他类型。
这个很简单,不必多说。

0 0
原创粉丝点击