Oop 如何将对象从基类转换为子类
我有一个classOop 如何将对象从基类转换为子类,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 } 这可能吗?如果
User
,它是classPFUser
的一个子类:
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。