如何将一个对象从它的基础 class 转换到它的子class

How to cast an object from its base class into its subclass

我有一个 class User 是 class PFUser 的子class PFUser:

class User: PFUser {
 var isManager = false
}

在我的一个方法中,我收到一个 PFUser 对象,我想将它转换为一个 User 对象

func signUpViewController(signUpController: PFSignUpViewController!, didSignUpUser user: PFUser!) {
 currentUser = user
}

这可能吗?

如果它是 PFUser 的实例,而不是存储在 PFUser 类型变量中的 User 实例,不,这是不可能的。

您可以将 class 的一个实例转换为它的一个超classes,但您不能以其他方式进行转换(除非转换类型是实际的实例类型)。

我建议在 User 中实现一个初始化程序,将 PFUser 实例作为参数 - 如果可能的话。

然而,虽然我从未尝试这样做,但我认为从 PFUser 继承你只会 运行 陷入麻烦,因为我的理解是这个 class 不是设计的PFObject 的原样被继承。我建议考虑将 PFUser 设为 User 的 属性 - 这样您就可以根据需要进行分配。

这种类型的转换是 downcast。给定某个 base class 的实例,其中您知道存在子 classes,您可以尝试使用类型转换运算符 as 进行向下转换:

class Base {}
class Derived : Base {}

let base : Base = Derived()
let derived = base as Derived

不过请记住,沮丧可能会失败:

class Base {}
class Derived : Base {}
class Other : Base {}

let base : Base = Other()
let derived = base as Derived  // fails with a runtime exception

您可以尝试 使用运算符as? 类型的可选形式 进行向下转型。

class Base {}
class Derived : Base {}
class Other : Base {}

let base : Base = Other()

// The idiomatic implementation to perform a downcast:

if let derived = base as? Derived {
    println("base IS A Derived")
}
else {
    println("base IS NOT A Derived")  // <= this will be printed.
}

这也可以通过以下方式完成:

object_setClass(baseClass, derivedClass.self)

然而,这毫无价值,因为它使用了 objc-runtime 库,如果使用不当,可能会导致奇怪的崩溃。