Aquí podría ser tu PUBLICIDAD


Cómo utilizar el protocolo genérico en la firma del método?

votos
0

El contexto es que tengo una clase Aque tiene muchas propiedades, pero yo sólo quiero exponer algunos de ellos y uno de ellos es un tipo genérico.

entonces trato de tener un protocolo genérico (tal vez eso es un nombre equivocado?) para la A.

Parece bien, pero cuando trato de usar el protocolo en lugar de la estructura en el método, no se compilará.

¿Alguna sugerencia?

protocol AProtocol {
    associatedtype T

    var t: T? { get }
}

struct A<Type>: AProtocol {
    typealias T = Type
    var t: Type?

    var a: Int
    var b: Int
    var c: Int
    var d: Int
    var e: Int
}

struct Main {
    func show<T: Decodable>(a: AProtocol<T>) { // error: Cannot specialize non-generic type 'AProtocol'

    }
}
Publicado el 03/06/2018 a las 02:17
fuente por usuario Tony Lin
En otros idiomas...        العربية       

1 respuestas

votos
2

No se puede utilizar un protocolo con tipos asociados por el estilo. Protocolos con tipos asociados no son los mismos que los protocolos genéricos. Este último no existe en Swift.

Lo que se suele hacer en esta situación es introducir un nuevo parámetro genérico, Ucon el método y restringir que con el protocolo:

func show<T, U>(a: U) where T: Decodable, U : AProtocol, U.T == T {

}

Las restricciones son 3:

  • T deben ajustarse a Decodable
  • U deben ajustarse a AProtocol
  • U.T debe ser el mismo que T

Tiene sentido, ¿verdad?

Respondida el 03/06/2018 a las 07:37
fuente por usuario Sweeper


Aquí podría ser tu PUBLICIDAD