web-dev-qa-db-fra.com

Utilisation de Predicate dans Swift

Je suis en train de suivre le tutoriel ici (apprentissage de Swift) pour ma première application: http://www.appcoda.com/search-bar-tutorial-ios7/

Je suis bloqué sur cette partie (code Objective-C):

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

Quelqu'un peut-il conseiller comment créer un équivalent pour NSPredicate dans Swift?

89
levitatejay

Ceci est vraiment juste un commutateur de syntaxe. OK, nous avons donc cet appel de méthode:

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

Dans Swift, les constructeurs ignorent la partie "blahWith ..." et n'utilisent que le nom de la classe en tant que fonction, puis passent directement aux arguments. Ainsi, [NSPredicate predicateWithFormat: …] deviendrait NSPredicate(format: …). (Pour un autre exemple, [NSArray arrayWithObject: …] deviendrait NSArray(object: …). Ceci est un motif régulier dans Swift.)

Alors maintenant, il suffit de passer les arguments au constructeur. En Objective-C, les littéraux NSString ressemblent à @"", mais en Swift, nous utilisons simplement des guillemets pour les chaînes. Donc ça nous donne:

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

Et en fait c'est exactement ce dont nous avons besoin ici.

(Incidemment, vous remarquerez que certaines des autres réponses utilisent plutôt une chaîne de format comme "name contains[c] \(searchText)". Ce n'est pas correct. Cela utilise une interpolation de chaîne, qui est différente de la mise en forme du prédicat et ne fonctionnera généralement pas pour cela.)

146
Chuck

Travailler avec le prédicat pendant assez longtemps. Voici ma conclusion (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])
42
Jiří Zahálka

Exemple d'utilisation dans 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) }

Vous obtiendrez (terrain de jeu)

enter image description here

23
gbk

Vous pouvez utiliser les filtres disponibles dans Swift pour filtrer le contenu d'un tableau au lieu d'utiliser un prédicat comme dans Objective-C.

Un exemple dans Swift 4.0 est le suivant:

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

Dans l'exemple ci-dessus, chaque élément du tableau étant une chaîne, vous pouvez utiliser la méthode contains pour filtrer le tableau.

Si le tableau contient des objets personnalisés, les propriétés de cet objet peuvent être utilisées pour filtrer les éléments de manière similaire.

9
Gurunath Sripad

Utilisez le code ci-dessous:

 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)
}
6
PREMKUMAR

Je pense que ce serait une meilleure façon de le faire à Swift:

func filterContentForSearchText(searchText:NSString, scope:NSString)
{
   searchResults = recipes.filter { name.rangeOfString(searchText) != nil  }
}
5
Harris

Dans Swift 2.2

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

Dans Swift 3.

func filterContent(forSearchText searchText: String, scope: String) {
        var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
        searchResults = recipes.filtered(using: resultPredicate)
    }
1
Saranjith

// change "name" et "value" en fonction des données de votre tableau.

// Change le nom "yourDataArrayName" en fonction de ton tableau (NSArray).

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

    if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {

 //enter code here.

        print(sortedDta)
    }
1
Hitesh Chauhan