如何将一个对象从它的基础 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 库,如果使用不当,可能会导致奇怪的崩溃。
我有一个 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 库,如果使用不当,可能会导致奇怪的崩溃。