Search code examples
swiftparse-platformcasting

Back4app - Swift - Cast PFObject to Class


I am trying to cast a PFObject to a custom class in Swift and I read a lot of post about it and in all of then I need to inherit my class from PFObject. The problem is that my class is already inherited from NSObject and there is a conflict between then.

Is there another way to cast a PFObject to a custom class?

Usuario.swift

class Usuario: NSObject, NSCoding {

    //MARK: Propriedades
    var nome: String?
    var foto: String?
    var dataNascimento: Date?
    var numeroTelefone: String?
    var pais: PaisCodigo?
    var telefoneE164: String?

    var objectId: String?
    var created: Date?
    var updated: Date?

    override init() {}

    required init(coder aDecoder: NSCoder) {

        nome = aDecoder.decodeObject(forKey: "nome") as? String
        foto = aDecoder.decodeObject(forKey: "foto") as? String
        dataNascimento = aDecoder.decodeObject(forKey: "dataNascimento") as? Date
        numeroTelefone = aDecoder.decodeObject(forKey: "numeroTelefone") as? String
        pais = aDecoder.decodeObject(forKey: "pais") as? PaisCodigo
        telefoneE164 = aDecoder.decodeObject(forKey: "telefoneE164") as? String

        objectId = aDecoder.decodeObject(forKey: "objectId") as? String
        created = aDecoder.decodeObject(forKey: "created") as? Date
        updated = aDecoder.decodeObject(forKey: "updated") as? Date
    }

    func encode(with aCoder: NSCoder) {

        if let nomeUsuario = nome {
            aCoder.encode(nomeUsuario, forKey: "nome")
        }

        if let fotoUsuario = foto {
            aCoder.encode(fotoUsuario, forKey: "foto")
        }

        if let dataNascimentoUsuario = dataNascimento {
            aCoder.encode(dataNascimentoUsuario, forKey: "dataNascimento")
        }

        if let numeroTelefoneUsuario = numeroTelefone {
            aCoder.encode(numeroTelefoneUsuario, forKey: "numeroTelefone")
        }

        if let paisUsuario = pais {
            aCoder.encode(paisUsuario, forKey: "pais")
        }

        if let telefoneE164Usuario = telefoneE164 {
            aCoder.encode(telefoneE164Usuario, forKey: "telefoneE164")
        }

        if let objectIdUsuario = objectId {
            aCoder.encode(objectIdUsuario, forKey: "objectId")
        }

        if let createdUsuario = created {
            aCoder.encode(createdUsuario, forKey: "created")
        }

        if let updatedUsuario = updated {
            aCoder.encode(updatedUsuario, forKey: "updated")
        }
    }
}

The Parse result using an objectId returns me this result:

<Usuario: 0x6080000abb20, objectId: 7NwpmD81w3, localId: (null)> {
    nome = "Pablo Cavalcante";
    numeroTelefone = 67992497386;
    pais = "<PaisCodigo: 0x6080000abb80, objectId: rA5wdIWEFt, localId: (null)>";
    telefoneE164 = "+5567992497386"; }

So it returns an Usuario object and I need to cast it.


Solution

  • You can use PFSubclassing. I see that you're declaring a user class so you could just subclass PFUser and then write something like this:

    class User: PFUser, PFSubclassing {
    
        //MARK: Propriedades
        dynamic var nome: String?
        dynamic var foto: String?
        dynamic var dataNascimento: Date?
        dynamic var numeroTelefone: String?
        dynamic var pais: PaisCodigo?
        dynamic var telefoneE164: String?
        dynamic var objectId: String?
        dynamic var created: Date?
        dynamic var updated: Date?
    
    }
    

    Of course if you're using the init(with:) and encode(with:) you have to implement it...