Swift中的铸造和向下铸造混乱?

Ali*_*li 3 casting type-conversion downcast upcasting swift

class Media {
    var name :String = ""
    init(name:String) {
        self.name = name
    }
}

class Song:Media {}

class Movie:Media{}

let s1 = Song(name :"Fireproof")
var m1 :Media = s1 //upcasting

//var s2 :Song = m1
var s2:Song = m1 as Song //down casting

// var x1 :Movie = m1 as Movie //
Run Code Online (Sandbox Code Playgroud)
  1. 在行上var m1: Media = s1你可以设置m1等于s1因为m1's类型是超类s1

  2. 在线var s2: Song = m1 as Song,它被认为是"向下铸造",是因为m1: Media并且你"铸造"它"作为"一种Song类型,以匹配相同类型的s2?(如果这是真的,那么为什么我们设置m1= s1更早,当s1有一个不同的类型而不是m1?)

  3. 所有这些铸造和铸造的重点是什么?我已经阅读了苹果文档,并设法让自己更加困惑:'(

Aar*_*ger 5

  1. 在行上var m1: Media = s1你可以设置m1等于s1因为m1's类型是超类s1

是.s1是一个Song,这意味着它也是一个定义Media.因此可以将其分配给类型Song或变量Media.

  1. 在线var s2: Song = m1 as Song,它被认为是"向下铸造",是因为m1: Media并且你"铸造"它"作为"一种Song类型,以匹配相同类型的s2?(如果这是真的,那么为什么我们设置m1= s1更早,当s1有一个不同的类型而不是m1?)

没有理由在实际代码中进行上传,然后立即进行预测.这只是示例代码,向您展示可以执行的操作.

顺便说一句,简单的"as"语法是旧的Swift - 你现在需要使用它,as!如果你确定它会在100%的时间内工作,或者as?如果你不确定的话.(谷歌"迅速可选的浇铸"以获得更多关于这一点.)普通老"为"现在仅适用于蒙上编译器知道总会的工作,像StringNSString.

  1. 所有这些铸造和铸造的重点是什么?我已经阅读了苹果文档,并设法让自己更加困惑:'(

这段代码中没有证明真正的观点.它通常用于与具有公共基类的异类数组进行交互.例如,如果您有一组不同的视图,您可能希望将它们放在一个数组中并对所有视图执行某些操作:

class ViewController : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()
        let button = UIButton()
        let slider = UISlider()

        let views = [label, button, slider] // views is a [UIView]

        for view in views {
            // view is known to be a UIView, even though it is also really a label, button, etc.
            view.translatesAutoresizingMaskIntoConstraints = false
            self.view.addSubview(view)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你不确定你需要知道这一点,现在就不用担心太多了.当你遇到一个问题时,回到这个问题,你有一堆相似类型的东西但不是完全相同的类型.