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

Oop 如何将对象从基类转换为子类,oop,object,swift,Oop,Object,Swift,我有一个classUser,它是classPFUser的一个子类: class User: PFUser { var isManager = false } 在我的一个方法中,我收到一个PFUser对象,我想将其强制转换为User对象 func signUpViewController(signUpController: PFSignUpViewController!, didSignUpUser user: PFUser!) { currentUser = user } 这可能吗?如果

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

class User: PFUser {
 var isManager = false
}
在我的一个方法中,我收到一个
PFUser
对象,我想将其强制转换为
User
对象

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

这可能吗?

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

您可以将一个类的实例强制转换为它的一个超类,但不能使用其他方法(除非强制转换类型是实际的实例类型)

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

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

这种类型的强制转换是一种向下转换。给定已知存在子类的某个基类的实例,您可以尝试使用类型转换运算符
作为

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.
}
类基类{}
派生类:基{}
类其他:基{}
让base:base=Other()
//执行向下广播的惯用实现:
如果让派生=基为?衍生{
println(“基是派生的”)
}
否则{

println(“基不是派生的”)//这也可以通过以下方法完成:

object_setClass(baseClass, derivedClass.self)

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

这肯定是可以接受的答案,因为它可以满足用户的要求。它被称为向下投射。看起来像是在一个80年历史的炸药箱上跳舞,但对于我所需要的东西来说效果非常好o。