2014-10-01 116 views
3

我想在迅速 对象数组进行搜索,但我不知道该怎么:(斯威夫特:对象数组搜索

我试图

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' 
+0

错误消息是什么? [问] – jtbandes 2014-10-01 06:12:31

+0

对不起,我在这里是新的,英语不是我的主要语言,所以我不知道,如果细节我很难给予很多,但我会尝试 – 2014-10-01 06:21:23

+1

我假设你得到这个错误,因为'filteredArrayUsingPredicate'是一个'NSArray'成员。在Swift中,你必须使用'Array'类型,它没有那个。查看@ fluidonic的答案,了解如何使用新的'filter'方法过滤'Array'。 – Isuru 2014-10-01 06:24:00

回答

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

最好的部分在这里你可以使用正则表达式的所有好处,并有你的旧数组的副本,所以如果你需要它。

感谢每一位求助。

11

查找特定对象的索引:

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

器阵列:

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

我得到这个错误swift:40:24:类型'search_options'不符合协议'Equatable' – 2014-10-01 06:24:14

+2

如果您希望两个'search_options'实例可以使用'= =“,那么类(或结构)必须实现”Equatable“协议。 – fluidsonic 2014-10-01 06:25:55

+0

好吧我会搜索到如何实现Equatable类,感谢帮助 – 2014-10-01 06:35:28

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")] 
+0

像我一样为我工作。非常感谢! – mizerablebr 2015-01-31 12:49:34

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

您必须检索搜索到的对象的属性,通过它进行搜索

+0

如何检查布尔? – Satyam 2016-08-04 15:10:47

+0

@Satyam你的意思是? – 2016-08-24 18:54:19

+0

我明白了。谢谢 – Satyam 2016-08-25 03:28:40