【问题标题】:Dictionary does not have a member named filter - but it should, shouldn't it?Dictionary 没有名为 filter 的成员 - 但它应该,不是吗?
【发布时间】:2014-11-11 20:22:45
【问题描述】:

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

显然发生了一些我不明白的事情 - 感谢任何指导。

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
}

【问题讨论】:

  • 这个 repo 中的 swift 项目充满了错误,我认为它还没有完成:如果你不想花一些时间来修复它作为学习实践,这不是最好的例子。 filter 属性必须被留下,因为作者试图重构代码并将NSArray(使用filteredArrayUsingPredicate 方法)替换为Dictionary
  • @A-Live - 非常感谢您对 MPGTextField 的评估。我将专注于学习,并在其他地方寻找实现。感谢您为我节省了很多麻烦。
  • @A-Live - 非常感谢您对 MPGTextField 的评估。我将专注于学习,并在其他地方寻找实现。感谢您为我节省了很多头撞墙的麻烦。 2010 Ray Wenderlich Obj-C 示例看起来很简单,但我很难让它在 Swift 中运行 - here is another thread on this approach

标签: xcode swift


【解决方案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") 过滤密钥 - 将其替换为更适合您的情况的内容

【讨论】:

    【解决方案2】:
    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
    }
    

    【讨论】:

    • 这个编译,如果理解(!),我将我的字符串转换为小写,创建一个空字典filteredData,如果数据字典不为空,我会在那里寻找一个键匹配显示文本,然后将键和值添加到过滤数据并返回 false。如果数据是空的,我会返回filteredData 字典。但是, filtedData 字典不会是空的吗?并且,Swift.filter(data) 行中的关键字 Swift 是做什么的?
    • 如果不希望函数在data为空时返回空字典,则将函数的返回类型改为[String : AnyObject]?,在data为空时返回nil . filter(data)Swift为前缀,避免与函数的参数名称冲突,也称为filter。修改参数名称后即可删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2015-05-23
    • 2014-11-09
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多