Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

265
Vistas
Need to satisfy Swift protocol requirement by using a specific subclass of the requirement (or type that conforms to it)

I have a protocol that I've created (in Swift 4.2), and one of its requirements is a property that is of the same type as the protocol itself.

As an example, I have a protocol defined like so:

protocol A {
    var a: A? { get set }
}

I have several Models that conform to this protocol:

class Model1: A {
    var a: A?
}
class Model2: A {
    var a: A?
}

For one of my models, I need to satisfy the protocol requirement by being more specific for the property defined by variable a (i.e. the variable with the protocol type). So for example I may want to implement Model2 as:

class Model2: A {
    var a: Model1?
}

In this case since Model1 conforms to the protocol A you would expect this to be able to satisfy the protocol requirement, however I get an error instead:

Type 'Model2' does not conform to protocol 'A'

Why is this happening, and what can I do to make it work as described above?

Appendix

I've modelled the above scenario in an Xcode Playground and here is a screenshot of the error I'm seeing. enter image description here

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

To conform to protocol A, Model2 would need a member var a that allows storing a reference to anything conforming to protocol A, not just a reference to a Model1. So you can't do this.

over 4 years ago · Santiago Trujillo Denunciar

0

You could do this with associated types:

protocol A {
    associatedtype B: A
    var a: B? { get }
}

This would let you declare Model2 with the specificity you wish:

class Model2: A {
    var a: Model1?
}

But unfortunately, that would mean you could no longer declare variables of type A. To fix that, you could use generic models:

class Model1<T: A>: A {
    var a: T?
}
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda