【问题标题】:Swift: array of objects searchSwift:对象数组搜索
【发布时间】:2014-10-01 06:11:18
【问题描述】:

我想快速搜索对象数组 但我不知道怎么做:(

我试过了

filteredArrayUsingPredicate

但仍然无法正常工作,它给了我一个错误消息

-- 更新--

错误信息是

swift:42:9: 'Array<search_options>' does not have a member named 'filteredArrayUsingPredicate'

-- 更新--

class search_options {
        let id:String
        let option:String

        init(){}

        init(id:String ,option:String){
            self.id = id
            self.option = option
        }
    }

我只想在选项变量中搜索

当我尝试使用时

func searchBarSearchButtonClicked( searchBar: UISearchBar!)
{
    let filteredArray = filter(search_options_array) { $0 == "test" }
    println(searchBar.text)
}

我收到了这条消息

swift:40:58: 'search_options' is not a subtype of 'String'

【问题讨论】:

  • 什么错误信息? How to Ask
  • 对不起,我是新来的,英语不是我的主要语言,所以我不知道,如果详细信息我很难提供很多信息,但我会尝试
  • 我假设您收到此错误是因为 filteredArrayUsingPredicateNSArray 成员。在 Swift 中,您必须使用没有该类型的 Array。查看下面@fluidsonic 的答案,了解如何使用新的filter 方法过滤Array
  • 谢谢,我试过了,我得到了新的错误信息

标签: ios arrays swift


【解决方案1】:

查找特定对象的索引:

if let index = find(myArray, objectIAmLookingFor) {
    // found! do something
}

过滤器数组:

let filteredArray = filter(myArray) { $0 == objectIAmLookingFor }

【讨论】:

  • 我得到这个错误 swift:40:24: Type 'search_options' does not conform to protocol 'Equatable'
  • 如果你想让search_options 的两个实例使用== 进行比较,那么类(或结构)必须实现Equatable 协议。
  • 好的,我会搜索如何实现 Equatable 类,谢谢帮助
【解决方案2】:

终于经过长时间的搜索我没有!, 我正在寻找一种方法来进行动态搜索,例如字符串数组是否包含

"hello","lo","yes"

我想获取所有包含例如“lo”的字符串 我想得到“hello”和“lo”

所以我找到的最好方法是正则表达式搜索

所以我做了一个 For 循环,抛出数组中的所有选项,并将每个对象变量与模式进行比较,并将其保存在对象上的新数组中

    for var i = 0; i < search_options_array.count; i++ {
        let myRegex = "searched_text"
        if let match = search_options_array[i].option.rangeOfString(myRegex, options: .RegularExpressionSearch){
            filtered_options_array.append(search_options(id:search_options_array[i].id,option:search_options_array[i].option) )
        }
    }

这里最好的部分是您可以使用正则表达式的所有好处并拥有旧数组的副本,以便在需要时使用。

感谢大家的帮助。

【讨论】:

    【解决方案3】:

    因为filter 接受一个函数作为谓词,该函数将给定Array 的每个元素映射到Bool 值(以确定应该过滤掉哪个值),在您的情况下可能是这种方式;

    let a = [
        search_options(id: "a", option: "X"),
        search_options(id: "b", option: "Y"),
        search_options(id: "c", option: "X")
    ]
    
    let b = filter(a) { (e: search_options) in e.option == "X" }
    // ==> [search_options(id: "a", option: "X"), search_options(id: "c", option: "X")]
    

    【讨论】:

    • 像手套一样为我工作。非常感谢!
    【解决方案4】:

    正确答案是

    func searchBarSearchButtonClicked( searchBar: UISearchBar!)
    {
        let filteredArray = filter(search_options_array) { $0.option == "test" }
        println(searchBar.text)
    }
    

    func searchBarSearchButtonClicked( searchBar: UISearchBar!)
    {
        let filteredArray = filter(search_options_array) { $0.id == "test" }
        println(searchBar.text)
    }
    

    您必须检索您执行搜索的搜索对象的属性

    【讨论】:

    • 如何检查布尔值?
    • @Satyam 你是什么意思?
    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 2017-08-27
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多