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 //
在var m1: Media = s1
行上,您可以将m1
设置为s1
,因为m1
的类型是s1
的超类??
在var s2: Song = m1 as Song
行,据说"向下投射",是因为m1: Media
而你是"施放"它" as" as" Song
类型,以匹配相同类型的s2
? (如果这是真的,那么为什么我们之前设置m1
= s1
,s1
的类型与m1
不同?
所有这些铸造和铸造的重点是什么?我已经阅读了苹果文档并设法让自己更加困惑:'(
答案 0 :(得分:5)
- 在
var m1: Media = s1
行上,您可以将m1
设置为s1
,因为m1
的类型是s1
的超类? / LI> 醇>
是。 s1
是Song
,这意味着它根据定义也是Media
。因此,可以将其分配给Song
或Media
类型的变量。
- 在线
醇>var s2: Song = m1 as Song
,据说"向下投射",是因为m1: Media
而你是"施放"它" as" as"Song
类型,以匹配相同类型的s2
? (如果这是真的,那么为什么我们之前设置m1
=s1
,s1
的类型与m1
不同?
没有理由在实际代码中进行上传,然后立即向下转发。这只是示例代码,显示了您可以执行的操作。
顺便说一句,平原" as"语法是旧Swift - 如果您确定它将在100%的时间内正常工作,您现在需要使用as!
,如果您不确定,则需要as?
。 (Google" swift可选的演员"有关此内容的更多信息。)简单的旧" as"现在仅对编译器知道将始终有效的强制转换有效,例如从String
到NSString
。
- 所有这些铸造和铸造的重点是什么?我已经阅读了苹果文档,并设法让自己更加困惑:'(
醇>
此代码中没有显示真正的观点。它通常用于与具有公共基类的异类数组进行交互。例如,如果您有一组不同的视图,您可能希望将它们放在一个数组中并对所有视图执行某些操作:
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)
}
}
}
如果你不确定你需要知道这一点,那么现在就不用担心它太多了。当你遇到一堆类似但类型不同的问题时,回过头来看看。