我有一个类User
,它是类PFUser
的子类:
class User: PFUser {
var isManager = false
}
在我的一个方法中,我收到一个PFUser
对象,我想将其转换为User
对象
func signUpViewController(signUpController: PFSignUpViewController!, didSignUpUser user: PFUser!) {
currentUser = user
}
这可能吗?
答案 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库会引入奇怪的崩溃是没有价值的。