Filtre de Tableau [AnyObject] en Swift
J'ai un tableau de AnyObject
objets en Swift. Chaque objet possède les attributs d'un restaurant, telles que le nom, le type, loc, etc. Comment puis-je filtrer le tableau si je veux garder tous les objets dans le tableau qui contiennent du type: "Sushi".
Exemple de tableau de [AnyObject]
avec 2 objets. Le filtre doit garder le premier objet (type: sushi):
[<Restaurant: 0x7ff302c8a4e0, objectId: LA74J92QDA, localId: (null)> {
City = "New York";
Country = "United States";
Name = Sumo Japan;
Type = Sushi, Japanese, Asian;
}, <Restaurant: 0x7ff302daa790, objectId: 0aKFrpKN46, localId: (null)> {
City = "New York";
Country = "United States";
Name = Little Italy;
Type = Italian, Pizza;
}]
Code actuel (mais je ne sais pas si le filtre de recherche par le biais d'un tableau de [AnyObject]
) :
var query = PFQuery(className:"Restaurant")
query.whereKey("RestaurantLoc", nearGeoPoint:userGeoPoint, withinMiles:50)
query.limit = 2
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if objects != nil {
println("list of objects of nearby")
println(objects)
let searchString = "Sushi"
let predicate = NSPredicate(format: "Type CONTAINS[cd] %@", searchString);
//Line below gives error: '[AnyObject]' does not have a member named 'filteredArrayUsingPredicate'
//let filteredArray = objects.filteredArrayUsingPredicate(predicate!)
- Une question: je comprends votre tableau est déclaré comme [AnyObject], mais dans votre cas, il est sûr de supposer qu'il ne contient que des éléments de type de Restaurant?
Vous devez vous connecter pour publier un commentaire.
Votre tableau,
objects
, est un tableau dePFObject
objets. Ainsi, pourfilter
le tableau, vous pourriez faire quelque chose comme:Ma réponse originale à cette question, sur la base d'une hypothèse que nous avions affaire à la coutume
Restaurant
objets, est ci-dessous:Vous pouvez utiliser le
filter
méthode.Supposons
Restaurant
a été définie comme suit:Donc, en supposant que
type
est un tableau de chaînes, vous feriez quelque chose comme:Si votre tableau de types pourrait être
nil
, vous feriez un conditionnel déballage de celui-ci:Les détails varient un peu en fonction de votre déclaration de
Restaurant
, dont vous n'avez pas partagé avec nous, mais j'espère que cela illustre bien l'idée.type
est définie comme une chaîne de caractères. Toutefois, le code donne l'erreur:Use of undeclared type 'Restaurant'
Restaurant
. Pourquoi ne pas nous montrer précisément ce que la définition de cette classe/struct ressemble et nous allons être en mesure de prendre de meilleures suggestions. Il est difficile d'écrire le code d'une classe, nous n'avons pas. Ou pas en arrière et d'embrasser le thème commun à toutes ces réponses, que vous avez un rapide tableau, et si vous aurez probablement besoin d'utiliserfilter
pour obtenir lefilteredArray
. Les détails varient en fonction de votre mise en œuvre.objects
dans le code actuel. i.imgur.com/OpM77ZK.png En d'autres termes, je n'ai pas spécialement créer le tableau de n'importe où dans le code, la requête générée le tableau.PFObject
objets. Franchement, je devrais en avoir déduit que le fait de regarder votrePFQuery
de référence. De toute façon, si c'est le cas, vous pouvez utiliser quelque chose comme mon révisé réponse. Je suis aussi maintenant deviner que leType
propriété n'est pas un tableau de chaînes de caractères, mais une chaîne délimitée par des virgules.if let type = ($0 as PFObject)["Type"] as String { return type.rangeOfString("Sushi") != nil
if let
la ligne (a) jette les objets individuels dans le tableauPFObject
objets; b) obtient leType
propriété de cet objet; et (c) éventuellement distributions à une chaîne. LerangeOfString
tests pour voir si le "Sushi" apparaît n'importe où dans la chaîne.objects
etfilteredArray
comme des tableaux globaux afin que je puisse les appeler dans d'autres fonctions? Depuis le bloc est exécuté de manière asynchrone, c'est récupérée dans le fond et peuvent ne pas être disponibles immédiatement.Ok, si le tableau objets ne contient que des Restaurant(s) le code suivant ne fonctionne pas.
Permet de dire que le Restaurant est quelque chose comme ceci:
Tout d'abord permet de définir un tableau de Restaurant(s).
Ensuite, nous pouvons filtrer:
Mise à jour:
Maintenant, je suis en supposant que objets est un tableau de PFObject(s)
Il suffit de les ignorer mon code précédent et essayez ce qui suit:
Peut-être qu'il va se planter encore une fois, le problème est que je ne connais pas le type de Restaurant.Type. Je suis en train. Peut-être que le message d'erreur suivant sera de fournir des informations plus utiles.
objects
est automatiquement généré à partir de l'analyse de la requêtevar query = PFQuery(className:"Restaurant")
afin de utiliser les des restaurants.filtre, ai-je besoin pour reconstruire la matrice? Parce que le code actuel donne l'erreurundeclared type 'Restaurant'
lorsque je l'utilise avec le tableau des objetsType 'AnyObject!' does not conform to protocol 'SequenceType'
l'erreur de points à la parolecontains
Swift 3 Solution
Utiliser le méthode de filtre sur un tableau.
ou
return Bool(restaurant.type.contains("sushi"))
si le type est un tableau.Modification de Rob réponse aussi rapide 2.0, En swift 2.0 à l'aide de Rob code donne une erreur comme suit -
Cependant, il peut être résolu à l'aide de la garde déclaration au lieu de si-laissez-le comme ci-dessous -
J'ai une solution comme indiqué ci-dessous.