es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

API de Swift Collection: extender con una variable computada: error de tipo

Tengo el siguiente método:

private func returnNilIfEmpty<T: Collection>(_ collection: T?) -> T? {
    guard let collection = collection else { return nil }
    return collection.isEmpty ? nil : collection
}

Me gustaría extender la API de Collection para usar una variable computada que extraiga el valor no vacío de esta manera:

extension Collection {
    var nonEmptyValue: Collection? {
        returnNilIfEmpty(self)
    }
}

Sin embargo, estoy obteniendo el siguiente error:

El protocolo ‘Collection’ solo se puede utilizar como una restricción genérica porque tiene requisitos de ‘Self’ o tipos asociados

Esto es claro, ya que la colección externa puede ser cualquier colección (por ejemplo, una [Int]) mientras que la colección dentro de returnNilIfEmpty puede ser, por ejemplo, un String.

La pregunta es cómo puedo hacer cumplir la regla de que la Collection devuelta a través de nonEmptyValue y la devuelta a través de returnNilIfEmpty sean del mismo tipo, de modo que pueda eliminar este error del compilador.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para aplicar la regla de que la Colección devuelta mediante nonEmptyValue y la devuelta mediante returnNilIfEmpty sean del mismo tipo, se puede agregar la misma restricción genérica a nonEmptyValue que al método returnNilIfEmpty.

    Aquí está la extensión actualizada:

    extension Collection where Self == T, T: Collection {
        var nonEmptyValue: T? {
            return returnNilIfEmpty(self)
        }
    }
    

    La condición where Self == T significa que el tipo externo Colección y el tipo interno de Colección devuelto por returnNilIfEmpty deben ser iguales. El T: Colección asegura que T es un tipo de colección, lo cual es requerido por el método returnNilIfEmpty.

    Con estas restricciones establecidas, el compilador ahora garantizará que se utilice el tipo correcto al llamar nonEmptyValue.

Comments are closed.