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

时间:2015-01-10 10:44:24

标签: oop object swift

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

class User: PFUser {
 var isManager = false
}

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

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

这可能吗?

3 个答案:

答案 0 :(得分:4)

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

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

我建议在User中实施初始值设定项,将PFUser实例作为参数 - 如果可能的话。

然而,虽然我从未试图这样做,但我认为从PFUser继承你只会遇到麻烦,因为我的理解是这个类不是为了{而是为了继承而设计的}的{1}}。我建议考虑将PFObject作为PFUser的属性 - 这样您就可以根据需要进行分配。

答案 1 :(得分:3)

这种类型的转换是向下转换。给定某个 base 类的实例,您知道存在子类,您可以尝试使用类型转换运算符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.
}

答案 2 :(得分:3)

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

object_setClass(baseClass, derivedClass.self)

然而,如果没有正确使用,那么使用objc-runtime库会引入奇怪的崩溃是没有价值的。