I have an array of AnyObject
objects in Swift. Each object has attributes of a restaurant, such as name, type, loc, etc. How can I filter the array if I want to keep all objects in the array that contain type: "Sushi".
Sample array of [AnyObject]
with 2 objects. The filter should keep the first object (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; }]
Current Code (but I'm not sure if the filter can search through an array of [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!)
Swift Array Initialization An array is a data type designed specifically to hold multiple values in a single ordered collection. An array, for example, could be created to store a list of String values. Strictly speaking, a single Swift based array is only able to store values that are of the same type.
Your array, objects
, is an array of PFObject
objects. Thus, to filter
the array, you might do something like:
let filteredArray = objects.filter() { if let type = ($0 as PFObject)["Type"] as String { return type.rangeOfString("Sushi") != nil } else { return false } }
My original answer, based upon an assumption that we were dealing with custom Restaurant
objects, is below:
You can use the filter
method.
Let's assume Restaurant
was defined as follows:
class Restaurant { var city: String var name: String var country: String var type: [String]! init (city: String, name: String, country: String, type: [String]!) { ... } }
So, assuming that type
is an array of strings, you'd do something like:
let filteredArray = objects.filter() {contains(($0 as Restaurant).type, "Sushi")}
If your array of types could be nil
, you'd do a conditional unwrapping of it:
let filteredArray = objects.filter() { if let type = ($0 as Restaurant).type as [String]! { return contains(type, "Sushi") } else { return false } }
The particulars will vary a little depending upon your declaration of Restaurant
, which you haven't shared with us, but hopefully this illustrates the idea.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With