El tipo de valor de la ruta clave ‘Int’ no se puede convertir al tipo contextual ‘String’.
Estoy tratando de pasar múltiples tuplas que contienen un KeyPath y un tipo de ordenamiento a un método que debe realizar una ordenación.
Tengo este método:
extension Array {
mutating func sort<t: comparable="">(by criteria: (path: KeyPath<element, t="">, order:OrderType)...) {
criteria.forEach { path, order in
//...
sort { first, second in
order.makeComparator()(
first[keyPath: path],
second[keyPath: path]
)
}
}
}
}
y lo estoy usando de la siguiente manera:
var posts = BlogPost.examples
posts.sort(by: (path:\.pageViews, order: .asc), (path:\.sessionDuration, order: .desc))
Ahora, dado que tanto las propiedades pageViews
como sessionDuration
son enteros, esto funcionará.
Pero si quiero pasar dos propiedades de diferentes tipos (por ejemplo, una cadena de texto y un entero), obtengo este error:
El tipo de valor de la ruta de acceso clave 'Int' no se puede convertir en el tipo contextual 'String'.
Aquí está el resto del código, pero supongo que no es tan relevante:
enum OrderType: String {
case asc
case desc
}
extension OrderType {
func makeComparator<t: comparable="">() -> (T, T) -> Bool {
switch self {
case .asc:
return (<)
case .desc:
return (>)
}
}
}
¿Cómo debo definir el método de ordenación para que acepte key paths heterogéneos?</element,>
davy.ai
Para que el método
sort
acepte rutas de clave heterogéneas, es necesario hacerlo genérico con dos parámetros de tipo. Uno para el tipo de la ruta de clave y otro para el tipo del orden. La nueva implementación se vería así:Aquí, especificamos los tipos
Key
yOrder
, y también agregamos una cláusulawhere
con dos restricciones:Order
debe serRawRepresentable
con un valor en bruto deString
. Esto se debe a que usamos el enumOrderType
para representar el orden de clasificación, y tiene un valor en bruto deString
.Key
debe serComparable
. Esto se debe a que necesitamos poder comparar valores de la ruta de clave al ordenar.Con estos cambios, ahora puedes pasar tuplas de rutas de clave heterogéneas al método
sort
:Esto ordenará el arreglo de objetos
BlogPost
porpageViews
en orden ascendente y luego portitle
en orden descendente.</element,></key,>