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.
davy.ai
Para aplicar la regla de que la
Colección
devuelta mediantenonEmptyValue
y la devuelta mediantereturnNilIfEmpty
sean del mismo tipo, se puede agregar la misma restricción genérica anonEmptyValue
que al métodoreturnNilIfEmpty
.Aquí está la extensión actualizada:
La condición
where Self == T
significa que el tipo externoColección
y el tipo interno deColección
devuelto porreturnNilIfEmpty
deben ser iguales. ElT: Colección
asegura que T es un tipo de colección, lo cual es requerido por el métodoreturnNilIfEmpty
.Con estas restricciones establecidas, el compilador ahora garantizará que se utilice el tipo correcto al llamar
nonEmptyValue
.