Utilizzando Predicato in Swift

Sto lavorando attraverso il tutorial qui (apprendimento veloce) per la mia prima app:
http://www.appcoda.com/search-bar-tutorial-ios7/

Mi sono bloccato su questa parte (Objective-C), del codice):

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c]         %@", searchText];
    searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}

Qualcuno può consigliare come creare un equivalente per NSPredicate in Swift?

 

8 Replies
  1. 148

    Questo è davvero solo una sintassi interruttore. OK, così abbiamo la chiamata a questo metodo:

    [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];

    In Swift, i costruttori di saltare la “blahWith…” parte e basta usare il nome della classe come una funzione e poi andare dritto per argomenti, in modo [NSPredicate predicateWithFormat: …] sarebbe diventato NSPredicate(format: …). (Per fare un altro esempio, [NSArray arrayWithObject: …] sarebbe diventato NSArray(object: …). Questo è un modello regolare in Swift.)

    Così ora abbiamo solo bisogno di passare i parametri al costruttore. In Objective-C, NSString letterali aspetto @"", ma in Swift dobbiamo solo utilizzare le virgolette per le stringhe. Quindi, che ci dà:

    let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)

    E in realtà questo è esattamente ciò di cui abbiamo bisogno qui.

    (Per inciso, si noterà che alcune delle altre risposte invece di usare una stringa di formato come "name contains[c] \(searchText)". Che non è corretto. Che utilizza la stringa di interpolazione, che è diverso dal predicato formattazione e, in generale, non lavoro per questo.)

    • Grazie. Si salva me un giorno!
    • Per affrontare la seconda riga del tuo metodo, è possibile utilizzare il predicato: searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
  2. 42

    Di lavoro con predicato per un tempo sufficientemente lungo. Qui è la mia conclusione (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])
    • Qual è la parità con LIKE 'a%z' ?
  3. 23

    Esempio di come utilizzare in 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) }

    Vi saranno mostrati (parco giochi)

    Utilizzando Predicato in Swift

    • E se… Se io ho un array di dizionari? Come posso analizzare per ottenere i dati?
    • hai bisogno di AUTO.yourkeyname per il filtraggio gamma di dizionari.
  4. 9

    È possibile utilizzare i filtri disponibili nella swift per filtrare il contenuto di un array invece di utilizzare un predicato come in Objective-C.

    Un esempio di Swift 4.0 è come segue:

    var stringArray = ["foundation","coredata","coregraphics"]
    stringArray = stringArray.filter { $0.contains("core") }

    Nell’esempio di cui sopra, dal momento che ogni elemento dell’array è una stringa, è possibile utilizzare il contains metodo per filtrare l’array.

    Se l’array contiene oggetti personalizzati, quindi le proprietà di tale oggetto può essere utilizzato per filtrare gli elementi allo stesso modo.

  5. 6

    Utilizzare Il seguente codice:

     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)
    }
    • Per qualche motivo la scrittura, come non ha funzionato per me comunque fa lasciare myPredicateString = “name contiene[c](testodacercare)” e quindi fare var resultPredicate : NSPredicate = NSPredicate(formato:myPredicateString) fatto
  6. 5

    Credo che questo sarebbe un modo migliore per farlo in Swift:

    func filterContentForSearchText(searchText:NSString, scope:NSString)
    {
       searchResults = recipes.filter { name.rangeOfString(searchText) != nil  }
    }
    • Questo è più idiomatiche se stai filtrando un Sequence, ma ci sono casi in cui è necessario un NSPredicate, come quando ha a che fare con NSFetchedResultsController.
  7. 1

    In swift 2.2

    func filterContentForSearchText(searchText: String, scope: String) {
        var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
        searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
    }

    In swift 3.0

    func filterContent(forSearchText searchText: String, scope: String) {
            var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
            searchResults = recipes.filtered(using: resultPredicate)
        }
    • Breve e semplice soluzione funziona bene.
  8. 1

    //cambiare il “nome” e “valore”, secondo la matrice di dati.

    //Cambia “yourDataArrayName” nome accroding al tuo array(NSArray).

        let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")
    
        if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {
    
     //enter code here.
    
            print(sortedDta)
        }

Lascia un commento