如何将对象从其基类转换为其子类

gra*_*ury 5 oop object swift

我有一个类User,它是class的子类PFUser

class User: PFUser {
 var isManager = false
}
Run Code Online (Sandbox Code Playgroud)

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

func signUpViewController(signUpController: PFSignUpViewController!, didSignUpUser user: PFUser!) {
 currentUser = user
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Cou*_*per 10

这种类型的铸造是一种沮丧。给定某个类的实例,其中您知道存在子类,您可以尝试使用类型转换运算符进行向下转换as

class Base {}
class Derived : Base {}

let base : Base = Derived()
let derived = base as Derived
Run Code Online (Sandbox Code Playgroud)

但请记住,向下转型可能会失败:

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

let base : Base = Other()
let derived = base as Derived  // fails with a runtime exception
Run Code Online (Sandbox Code Playgroud)

您可以尝试使用类型为 operator的可选形式进行向下转换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.
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*tas 6

这也可以通过使用以下方法来完成:

object_setClass(baseClass, derivedClass.self)
Run Code Online (Sandbox Code Playgroud)

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

  • 看起来就像在一箱 80 年前的炸药上跳舞,但非常适合我需要做的事情。 (2认同)

Ant*_*nio 5

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

您可以将类的实例强制转换为其超类之一,但不能以其他方式执行(除非强制转换类型是实际的实例类型)。

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

但是,虽然我从未尝试这样做,但我认为从PFUser您那里继承只会遇到麻烦,因为我的理解是该类不是为了继承而设计的PFObject。我建议考虑创建PFUser一个属性User- 这样您就可以根据需要进行分配。