ios - Usando Predicate en Swift
objective-c ios7 (8)
Estoy trabajando en el tutorial aquí (aprendiendo Swift) para mi primera aplicación: http://www.appcoda.com/search-bar-tutorial-ios7/
Estoy atrapado en esta parte (código Objective-C):
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}
¿Alguien puede aconsejar cómo crear un equivalente para NSPredicate en Swift?
// cambia "nombre" y "valor" según los datos de tu matriz.
// Cambia el nombre de "yourDataArrayName" por su matriz (NSArray).
let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")
if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {
//enter code here.
print(sortedDta)
}
Creo que esta sería una mejor manera de hacerlo en Swift:
func filterContentForSearchText(searchText:NSString, scope:NSString)
{
searchResults = recipes.filter { name.rangeOfString(searchText) != nil }
}
Ejemplo de cómo usar en swift 2.0
let dataSource = [
"Domain CheckService",
"IMEI check",
"Compliant about service provider",
"Compliant about TRA",
"Enquires",
"Suggestion",
"SMS Spam",
"Poor Coverage",
"Help Salim"
]
let searchString = "Enq"
let predicate = NSPredicate(format: "SELF contains %@", searchString)
let searchDataSource = dataSource.filter { predicate.evaluateWithObject($0) }
Obtendrás (patio de recreo)
Esto es realmente solo un interruptor de sintaxis. OK, entonces tenemos esta llamada de método:
[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
En Swift, los constructores omiten la parte "blahWith ..." y simplemente usan el nombre de clase como una función y luego van directamente a los argumentos, por lo que [NSPredicate predicateWithFormat: …]
se convertiría en NSPredicate(format: …)
. (Para otro ejemplo, [NSArray arrayWithObject: …]
se convertiría en NSArray(object: …)
. Este es un patrón regular en Swift.)
Entonces ahora solo tenemos que pasar los argumentos al constructor. En Objective-C, los literales de NSString parecen @""
, pero en Swift simplemente utilizamos comillas para cadenas. Entonces eso nos da:
let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
Y de hecho eso es exactamente lo que necesitamos aquí.
(Por cierto, notará que algunas de las otras respuestas usan una cadena de formato como "name contains[c] /(searchText)"
. Eso no es correcto. Utiliza la interpolación de cadenas, que es diferente del formato de predicado y generalmente no trabajar para esto.)
Puede usar filtros disponibles en swift para filtrar el contenido de una matriz en lugar de usar un predicado como en Objective-C.
Un ejemplo en Swift 4.0 es el siguiente:
var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }
En el ejemplo anterior, dado que cada elemento de la matriz es una cadena, puede usar el método contains
para filtrar la matriz.
Si la matriz contiene objetos personalizados, las propiedades de ese objeto se pueden utilizar para filtrar los elementos de manera similar.
Trabajando con predicado durante bastante tiempo. Aquí está mi conclusión (SWIFT)
//Customizable! (for me was just important if at least one)
request.fetchLimit = 1
//IF IS EQUAL
//1 OBJECT
request.predicate = NSPredicate(format: "name = %@", txtFieldName.text)
//ARRAY
request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])
// IF CONTAINS
//1 OBJECT
request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text)
//ARRAY
request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])
Use el siguiente código:
func filterContentForSearchText(searchText:NSString, scopes scope:NSString)
{
//var searchText = ""
var resultPredicate : NSPredicate = NSPredicate(format: "name contains[c]/(searchText)", nil)
//var recipes : NSArray = NSArray()
var searchResults = recipes.filteredArrayUsingPredicate(resultPredicate)
}
En veloz 2.2
func filterContentForSearchText(searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
}
En veloz 3.0
func filterContent(forSearchText searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = recipes.filtered(using: resultPredicate)
}