2015-01-10 5 views
1

У меня есть класс User который является подклассом класса PFUser:Как бросить объект из своего базового класса в его подкласс

class User: PFUser { 
var isManager = false 
} 

В одном из моих методов я получаю PFUser объект, и я хочу, чтобы бросить до User объект

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

Возможно ли это?

ответ

3

Если это экземпляр PFUser, а не экземпляр User, хранящийся в переменной PFUser, нет, это невозможно.

Вы можете указать экземпляр класса в один из его суперклассов, но вы не можете сделать другой способ (если тип приведения не является фактическим типом экземпляра).

Я предлагаю реализовать инициализатор в User, принимая пример PFUser как параметр - если это возможно.

Однако, хотя я никогда не пытался это сделать, я думаю, что наследуя от PFUser, вы просто столкнетесь с проблемами, так как я понимаю, что этот класс не предназначен для наследования, как и для PFObject. Я бы предложил изучить PFUser свойство User - таким образом вы можете просто назначить по мере необходимости.

3

Этот тип отливки downcast. Учитывая экземпляр определенного базы класса, где вы знаете, существуют подклассы, вы можете попробовать обратное приведение с приведение типа оператора 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 

попробуйте a downcast с использованием необязательной формы такого типа, как оператор 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. 
} 
1

Это также может быть сделано с помощью следующих действий:

object_setClass(baseClass, derivedClass.self) 

Однако это ничего не стоит, что это использует библиотеку ObjC-времени выполнения, которые могут ввести нечетные сбои, если не используется правильно.

Смежные вопросы