字典没有一个名为filter的成员 - 但它应该,不应该吗?

时间:2014-11-11 11:20:24

标签: xcode swift

我试图让code from github自动完成工作,但是我遇到第6行(data.filter)上的错误,即Dictionary没有名为filter的成员。但是我在文档中读到的所有内容都表明字典应该有一个过滤方法。我已经尝试了解包,自我等各种可能的组合,但编译器会将这些更改注册为错误。

显然有些事情我不明白 - 任何指导都值得赞赏。

var data = Dictionary<String, AnyObject>()    
func applyFilterWithSearchQuery(filter : String) -> Dictionary<String, AnyObject>
{
    var lower = (filter as NSString).lowercaseString
    if (data.count > 0) {
        var filteredData = data.filter ({
            if let match : AnyObject  = $0["DisplayText"]{
                return (match as NSString).lowercaseString.hasPrefix((filter as NSString).lowercaseString)
            }
            else{
                return false
            }
        })
    }
    return filteredData
}

2 个答案:

答案 0 :(得分:1)

从未听说过字典过滤器 - 你在哪里读到过这个?数组确实有filter方法,但没有字典。您可以做的是过滤键或值(可通过相应的字典属性访问)。

您可以使用以下代码在字典上实现自定义过滤器:

var filtered = dict.keys.filter { $0.hasPrefix("t") }.map { (key: $0, value: dict[$0]) }

var newDict = [String : AnyObject]()
for element in filtered {
    newDict[element.key] = element.value
}

过滤键,然后将每个键映射到(键,值)元组,然后将每个元组添加到新词典中。

请注意,要过滤使用hasPrefix("t")的密钥 - 请将其替换为更适合您案例的内容

答案 1 :(得分:0)

var data = Dictionary<String, AnyObject>()

func applyFilterWithSearchQuery(filter: String) -> [String : AnyObject] {
        var lower = filter.lowercaseString

        var filteredData = [String : AnyObject]()

        if (!data.isEmpty) {
                Swift.filter(data) {
                        (key, value) -> Bool in

                        if key == "DisplayText" {
                                filteredData[key] = (value as? String)?.lowercaseString.hasPrefix(lower)
                        }

                        return false
                }

                /* use map function works too
                map(data) {
                        (key, value) -> Void in

                        if key == "DisplayText" {
                                filteredData[key] = (value as? String)?.lowercaseString.hasPrefix(lower)
                        }
                }
                */
        }

        return filteredData
}