Oni*_*han 26 filter parse-platform swift
我AnyObject在Swift中有一个对象数组.每个对象都有一个餐馆的属性,例如名称,类型,位置等.如果我想保留数组中包含类型的所有对象:"Sushi",我如何过滤数组.
[AnyObject]包含2个对象的示例数组.过滤器应该保留第一个对象(类型:寿司):
[<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;
}]
Run Code Online (Sandbox Code Playgroud)
当前代码(但我不确定过滤器是否可以搜索数组[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!)
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 54
您的数组objects是一个PFObject对象数组.因此,对于filter数组,您可能会执行以下操作:
let filteredArray = objects.filter() {
if let type = ($0 as PFObject)["Type"] as String {
return type.rangeOfString("Sushi") != nil
} else {
return false
}
}
Run Code Online (Sandbox Code Playgroud)
基于我们处理自定义Restaurant对象的假设,我的原始答案如下:
您可以使用该filter方法.
我们假设Restaurant定义如下:
class Restaurant {
var city: String
var name: String
var country: String
var type: [String]!
init (city: String, name: String, country: String, type: [String]!) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
所以,假设这type是一个字符串数组,你可以这样做:
let filteredArray = objects.filter() {contains(($0 as Restaurant).type, "Sushi")}
Run Code Online (Sandbox Code Playgroud)
如果您的类型数组可能是nil,您将对其进行条件展开:
let filteredArray = objects.filter() {
if let type = ($0 as Restaurant).type as [String]! {
return contains(type, "Sushi")
} else {
return false
}
}
Run Code Online (Sandbox Code Playgroud)
根据你的声明Restaurant,你没有与我们分享,细节会有所不同,但希望这说明了这个想法.
Swift 3解决方案
在数组上使用filter方法.
let restaurants: [Restaurants] = [...]
restaurants.filter({(restaurant) in
return Bool(restaurant.type == "sushi")
})
Run Code Online (Sandbox Code Playgroud)
或者return Bool(restaurant.type.contains("sushi"))如果type是一个数组.
好的,如果数组对象只包含Restaurant(s),则以下代码可以正常工作.
让我们说餐厅是这样的:
enum RestaurantType {
case Sushi, Japanese, Asian
}
class Restaurant {
var type = [RestaurantType]()
// more properties here...
}
Run Code Online (Sandbox Code Playgroud)
首先,我们定义一系列餐厅.
var restaurants = objects as [Restaurant]
Run Code Online (Sandbox Code Playgroud)
然后我们可以过滤它:
var sushiRestaurants = restaurants.filter { (restaurant : Restaurant) -> Bool in
return contains(restaurant.type, .Sushi)
}
Run Code Online (Sandbox Code Playgroud)
Update: Now I am assuming objects is an array of PFObject(s) Just ignore my previous code and try this:
var restaurants = objects as [PFObject]
var sushiRestaurants = restaurants.filter { (restaurant : PFObject) -> Bool in
return contains(restaurant["Type"], "Sushi")
}
Run Code Online (Sandbox Code Playgroud)
Maybe it will crash again, the problem is that I don't know the type of Restaurant.Type. I'm trying. Maybe the next error message will provide more useful info.
将Rob的答案修改为Swift 2.0,在使用Rob的代码的swift 2.0中给出如下错误 -
initializer for conditional binding must have optional type, not 'string'
Run Code Online (Sandbox Code Playgroud)
但是可以通过使用guard语句而不是if-let来解决它 -
let filteredArray = objects.filter() {
guard let type = ($0 as PFObject)["Type"] as String else {
return false
}
return type.rangeOfString("Sushi") != nil
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58763 次 |
| 最近记录: |