我有一个类User,它是class的子类PFUser:
class User: PFUser {
var isManager = false
}
Run Code Online (Sandbox Code Playgroud)
在我的一个方法中,我收到一个PFUser对象,我想将它转换为一个User对象
func signUpViewController(signUpController: PFSignUpViewController!, didSignUpUser user: PFUser!) {
currentUser = user
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
Cou*_*per 10
这种类型的铸造是一种沮丧。给定某个基类的实例,其中您知道存在子类,您可以尝试使用类型转换运算符进行向下转换as:
class Base {}
class Derived : Base {}
let base : Base = Derived()
let derived = base as Derived
Run Code Online (Sandbox Code Playgroud)
但请记住,向下转型可能会失败:
class Base {}
class Derived : Base {}
class Other : Base {}
let base : Base = Other()
let derived = base as Derived // fails with a runtime exception
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用类型为 operator的可选形式进行向下转换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.
}
Run Code Online (Sandbox Code Playgroud)
这也可以通过使用以下方法来完成:
object_setClass(baseClass, derivedClass.self)
Run Code Online (Sandbox Code Playgroud)
然而,它使用 objc-runtime 库是毫无价值的,如果使用不当,它可能会导致奇怪的崩溃。
如果它是 的实例PFUser,而不是User存储在PFUser类型变量中的实例,则不可能。
您可以将类的实例强制转换为其超类之一,但不能以其他方式执行(除非强制转换类型是实际的实例类型)。
我建议在 中实现一个初始化程序User,将一个PFUser实例作为参数 - 如果可能的话。
但是,虽然我从未尝试这样做,但我认为从PFUser您那里继承只会遇到麻烦,因为我的理解是该类不是为了继承而设计的PFObject。我建议考虑创建PFUser一个属性User- 这样您就可以根据需要进行分配。