objective-c - arquitectura - firebase swift 4
¿Hay algo similar a LINQ en Objective-C? (6)
Creo que específico para su ejemplo esto sería el equivalente en Cocoa:
NSArray *people = /* array of people objects */
NSPredicate *pred = [NSPredicate predicateWithFormat:@"Id = 1 AND Id != 2"];
NSSortDescriptor *byName = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
NSArray *descriptors = [NSArray arrayWithObject:[byName autorelease]];
NSArray *matches = [people filteredArrayUsingPredicate:pred];
NSArray *sortedMatches = [matches sortedArrayUsingDescriptors:descriptors];
NSArray *justNames = [sortedMatches valueForKey:@"Name"];
Es un poco más detallado que el ejemplo LINQ y algunas de mis líneas podrían haberse combinado, pero a mi entender esto es más fácil de analizar.
Me pregunto si es posible (y cómo) proporcionar una clase en Objective-C con algo como:
Person.Select(@"Name").OrderAsc(@"Name").Where(@"Id").EqualTo(1).And(@"Id").NotEqualTo(2).Load<Array>
Eso podría ser muy útil para un proyecto que estoy haciendo.
Me gusta esta forma de codificación presente en Django y SubSonic.
Hay una acción que compara las formas de Windows y Cocoa de hacer esto. Cocoa usa Key Paths And NSPredicate ....
La respuesta corta es que no hay un equivalente a Linq para Objective-C, pero puede simularlo con una combinación de llamadas SQLite, NSPredicate y CoreData en una clase de contenedor configurada a su gusto. Probablemente le interese la guía de datos básicos , la guía de predicados y este código de ejemplo .
De la guía de predicados anterior:
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Employee"
inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
// assume salaryLimit defined as an NSNumber variable
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"salary > %@", salaryLimit];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
Consulte el siguiente repositorio: https://github.com/ziminji/objective-c-sql-query-builder
Estas clases proporcionan un conjunto de métodos de conveniencia que se pueden utilizar para crear consultas SQL bien formadas rápidamente para Sqlite. Son bastante simples de usar y son relativamente sencillos ya que siguen la sintaxis SQL básica.
Creé mi propia API de estilo Linq para Objective C, que está disponible en github . Su ejemplo específico se vería así:
NSArray* results = [[[people where:^BOOL(id person) {
return [person id] == 1 && [person id] != 2;
}]
select:^id(id person) {
return [person name];
}]
sort];
Mi proyecto, LINQ4Obj-C , conecta los operadores de consulta estándar de LINQ a Objective-C.
Puedes encontrarlo en github y sus documentos aquí . Esta biblioteca también está disponible a través de CococaPods .
El código fuente de este proyecto está disponible bajo la licencia estándar de MIT.
Tu ejemplo se vería así:
id results = [[[people linq_where:^BOOL(id person) {
return ([person ID] == 1);
}] linq_select:^id(id person) {
return [person name];
}] linq_orderByAscending];
Nota : eliminé la segunda condición (ID! = 2) ya que no tiene sentido.
Por el momento, la biblioteca proporciona métodos de extensión (categorías) para las clases de recopilación, pero en el futuro también NSManagedObjectContext
su funcionalidad a NSManagedObjectContext
para proporcionar acceso de consulta directa a los datos principales.