使用Swift中的[AnyObject]数组过滤Parse查询

时间:2015-03-23 15:39:13

标签: arrays swift filter parse-platform

我在Swift中有一个AnyObject对象数组(最终,这个数组将通过查询Parse数据库来填充)。数组中的每个对象都具有发布的属性,例如fullTitle,url和journal。如何过滤数组以选择与任何值的搜索字符串匹配的所有对象(例如,fullTitle,url,期刊包括“Forbes”)?

以下是操场上的示例代码。首先是样本数组:

var publication1 = [
    "fullTitle": "My first blog",
    "url": "www.forbes.com/post1",
    "journal": "Forbes
]

var publication2 = [
    "fullTitle": "My second blog",
    "url": "www.wsj.com/post1",
    "journal": "Wall Street Journal"
]

var publications: [AnyObject] = [publication1, publication2]

然后,过滤功能:

func filterContentForSearchText(searchText: String) {
    let filteredPublications = publications.filter() {
        if let fullTitle = ($0)["fullTitle"] as? String {
            return fullTitle.rangeOfString(searchText) != nil
        } else {
            return false
        }
    }
}

现在,如果我以“first”作为参数调用该函数,它应该将第一个对象从数组中返回:

println(filterContentForSearchText("first"))

但是,此命令不会产生任何结果。我怎样才能解决这个问题?另外,如何查询searchText对象的所有字段,而不仅仅是fullTitle字段?

谢谢。

3 个答案:

答案 0 :(得分:1)

这是一个简单的示例,它返回所有字段中的匹配数组:

func filterContentForSearchTextInAllFields(searchText: String) -> [String] {
    var results = [String]()
    for publication in publications {
        for (key, value) in publication {
            if (value as NSString).containsString(searchText) {
                results.append(value)
            }
        }
    }
    return results
}

println(filterContentForSearchTextInAllFields("blog"))

这只适用于标题:

func filterContentForSearchText(searchText: String) -> [String] {
    var results = [String]()
    for publication in publications {
        if let fullTitle = publication["fullTitle"] {
            if (fullTitle as NSString).containsString(searchText) {
                results.append(fullTitle)
            }
        }
    }
    return results
}

println(filterContentForSearchText("first"))

更新

这是您在评论中提出的问题的版本:

func filterContentForSearchText(searchText: String) -> [[String:String]] {
    var results = [[String:String]]()
    for publication in publications {
        if let fullTitle = publication["fullTitle"] as? String {
            if (fullTitle as NSString).containsString(searchText) {
                results.append(publication as! [String : String])
            }
        }
    }
    return results
}

println(filterContentForSearchText("first"))

你的"行"是字典:在循环中我们将每一个分配给"出版物"变量,所以我们只取一个标题与搜索词匹配的那个,然后将它附加到一个词典数组。

答案 1 :(得分:0)

这是我去的路线。而不是AnyObject数组我只是让Swift推断类型

var publications = [publication1, publication2]

func searchPublications(seachText: String) -> [[String: String]] {
   let filteredPublications = publications.filter { $0
       for (_, value) in $0 {
           if let found = value.rangeOfString(seachText, options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start: value.startIndex, end: value.endIndex), locale: NSLocale.currentLocale()) {
               return true
           }
       }

       return false
   }

   return filteredPublications
}

答案 2 :(得分:0)

    Swift 3.0
    This is worked for me.
    I want filter data by it's status 0 or 1. 

    var arrRooms:[[String:AnyObject]] = [
        [
            "id": 30 as AnyObject,
            "name": "Earth" as AnyObject,
            "status": 0 as AnyObject,
            "duration": 10 as AnyObject
        ],
        [
            "id": 27 as AnyObject,
            "name": "Mars" as AnyObject,
            "status": 1 as AnyObject,
            "duration": 0 as AnyObject
        ]
    ]

    let StatusPredicate = NSPredicate(format: "status = 1 ")

    let arrFilter:[[String:AnyObject]] = (arrRooms as NSArray).filtered(using: StatusPredicate) as! [[String : AnyObject]]

    print(arrFilter);
    // output [["name": Mars, "status": 1, "id": 27, "duration": 0]]

it may be useful.thanks