为什么我要在Swift中使用打字?

为什么我要在Swift中使用打字?,swift,casting,typecast-operator,Swift,Casting,Typecast Operator,为什么我要在Swift中使用打字 我正在学习这门语言,我遇到了打字的问题(例如向下和向上投射等),但在我看来这似乎有点麻烦。我为什么要打印一个对象?这在实际应用程序或代码中何时有用? 我在网上查了一会儿,但似乎找不到明确的答案。我真的被困在这里,所以一些帮助将是伟大的 提前谢谢 这里的关键案例是向下投射。这样做是因为您可能知道对象的真正类型,但编译器不知道,因此它不允许您将该类型的消息发送给该对象 例如: override func prepare(for segue: UIStoryboard

为什么我要在Swift中使用打字

我正在学习这门语言,我遇到了打字的问题(例如向下和向上投射等),但在我看来这似乎有点麻烦。我为什么要打印一个对象?这在实际应用程序或代码中何时有用? 我在网上查了一会儿,但似乎找不到明确的答案。我真的被困在这里,所以一些帮助将是伟大的


提前谢谢

这里的关键案例是向下投射。这样做是因为您可能知道对象的真正类型,但编译器不知道,因此它不允许您将该类型的消息发送给该对象

例如:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let dest = segue.destination as? FlipsideViewController {
        dest.delegate = self
    }
}
segue.destination
键入为UIViewController;这只是一个事实,并不取决于您,因为segue的目的地需要能够是任何类型的UIViewController

只有您知道此视图控制器实际上是FlipsideViewController。如果不告诉编译器,则无法设置其
委托
属性(普通UIViewController没有
委托
属性)


总而言之:常见的向下转换情况是,当一个类型需要声明为超类时,因为任何子类都需要被接受,但是在一个特定的实例中,您知道它是什么子类,所以您需要向下转换。当您不确定任何变量或类的类型时,会使用类型转换。
假设服务器响应中设置了一个变量值。它可以是多个对象类型,比如String、Int、Double。然后,您需要进行类型转换,以了解您要查找的确切类型

但是为什么不将其声明为特定类型呢?声明可能不取决于您。我将添加一个例子。因为继承和尽量不重复自己。如果您有一个,例如,
DataSource
作为核心,然后创建特定的
MyTopicDataSource:DataSource
,然后你可能想看看你是否在处理10个或20个MyTopicDataSource中的
MyTopicDataSource
,你必须做出一些特殊的决定,而不必为一个不同的行为编写一个全新的VC。我浏览了你刚才给我的链接,但这似乎让我更为复杂。在整个函数中,它接受Dog类型的参数,为什么不接受noisedog类型的参数呢?但这是人为的;我在上面的答案中给你的例子是非常真实的。