Swift:对象数组搜索

3
我想在Swift中的对象数组中进行搜索,但我不知道如何做:(
我尝试过:
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'

什么错误信息?[询问] - jtbandes
抱歉,我是新来的,英语不是我的母语,所以我不知道该怎么做,也很难提供很多细节,但我会尽力。 - Abdulaziz Noor
1
我猜你之所以会遇到这个错误,是因为filteredArrayUsingPredicateNSArray的成员。在Swift中,你必须使用类型Array,它没有这个方法。请查看下面@fluidsonic的答案,了解如何使用新的filter方法来过滤一个Array - Isuru
谢谢,我尝试了,但是出现了新的错误信息。 - Abdulaziz Noor
4个回答

11

查找特定对象的索引:

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

筛选数组:

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

我在Swift中遇到了一个错误:swift:40:24:类型'search_options'不符合协议'Equatable'。 - Abdulaziz Noor
2
如果您想使用==比较两个search_options实例,则该类(或结构体)必须实现Equatable协议。 - fluidsonic
好的,我会搜索如何实现Equatable类,谢谢你的帮助。 - Abdulaziz Noor

3

终于在漫长的搜索之后我找到了!,我一直在寻找一种方法来实现动态搜索,例如查找字符串数组中是否包含某个元素

"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) )
        }
    }

在这里,你可以利用正则表达式的所有优势,并拥有旧数组的副本,以便在需要时使用。

感谢每个人的帮助。


2

因为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")]

对我来说非常有效。非常感谢! - Bruno Morais

2
正确答案是:
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
@Satyam 你的意思是什么? - Nikolai Nagornyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接