【问题标题】:Up casting and down casting confusion in Swift?在 Swift 中向上转换和向下转换混淆?
【发布时间】:2015-09-16 05:35:50
【问题描述】:
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 并且您将它“转换为”Song 类型以匹配相同类型的 @ 987654330@? (如果这是真的,那我们为什么要更早设置m1 = s1,而s1 的类型与m1 不同??)

  3. 所有这些向上转换和向下转换的意义何在?我已经阅读了苹果文档并设法让自己更加困惑:'(

【问题讨论】:

  • 请粘贴代码。不是图片/图像/照片。

标签: swift casting type-conversion downcast upcasting


【解决方案1】:
  1. var m1: Media = s1这一行你可以设置m1等于s1,因为m1的类型是s1的超类??

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

  1. 在线var s2: Song = m1 as Song ,它应该是“向下转换”,是因为m1: Media 并且您正在“转换”它“作为”Song 类型以匹配相同类型的s2? (如果这是真的,那我们为什么要更早设置m1 = s1,而s1 的类型与m1 不同??)

在实际代码中,没有理由向上转换,然后立即向下转换。这只是示例代码,向您展示了您可以做的事情。

顺便说一句,简单的“as”语法是旧的 Swift - 如果您确定它会在 100% 的时间内工作,您现在需要使用 as!,如果您不确定,则需要使用 as?。 (谷歌“快速可选转换”了解更多信息。)普通的旧“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)
        }
    }
}

如果您不确定是否需要知道这一点,请暂时不要太担心。当您遇到一个问题,即您有一堆相似类型但并非所有类型相同的东西时,请回到这一点。

【讨论】:

  • 哦,我明白了,非常感谢您的帮助!我已经完成了快速学习的一半,但我仍然对如何独立编写自己的 iOS 应用程序一无所知.....我正在理解和学习代码以及如何将其应用于对象....我也遵循了基于项目的教程,但是我对如何通过代码实现我的应用程序想法有点怀疑......要编写什么代码(因为有更有效的编写方法它)以及基本上如何启动程序.....?对此的任何启示将不胜感激:)
  • 这是我帮助编写的免费教程:www.bloc.io/swiftris
  • 这可能对你有帮助
  • 谢谢兄弟!你太棒了!
  • 我很困惑我们应该在哪里使用as(没有?,!)。能再解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多