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

时间:2015-09-16 05:35:51

标签: swift casting type-conversion downcast upcasting

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 //
  1. var m1: Media = s1行上,您可以将m1设置为s1,因为m1的类型是s1的超类??

  2. var s2: Song = m1 as Song行,据说"向下投射",是因为m1: Media而你是"施放"它" as" as" Song类型,以匹配相同类型的s2? (如果这是真的,那么为什么我们之前设置m1 = s1s1的类型与m1不同?

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

1 个答案:

答案 0 :(得分:5)

  
      
  1. var m1: Media = s1行上,您可以将m1设置为s1,因为m1的类型是s1的超类? / LI>   

是。 s1Song,这意味着它根据定义也是Media。因此,可以将其分配给SongMedia类型的变量。

  
      
  1. 在线var s2: Song = m1 as Song,据说"向下投射",是因为m1: Media而你是"施放"它" as" as" Song类型,以匹配相同类型的s2? (如果这是真的,那么为什么我们之前设置m1 = s1s1的类型与m1不同?
  2.   

没有理由在实际代码中进行上传,然后立即向下转发。这只是示例代码,显示了您可以执行的操作。

顺便说一句,平原" as"语法是旧Swift - 如果您确定它将在100%的时间内正常工作,您现在需要使用as!,如果您不确定,则需要as?。 (Google" swift可选的演员"有关此内容的更多信息。)简单的旧" as"现在仅对编译器知道将始终有效的强制转换有效,例如从StringNSString

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

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

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)
        }
    }
}

如果你不确定你需要知道这一点,那么现在就不用担心它太多了。当你遇到一堆类似但类型不同的问题时,回过头来看看。