2014-10-01 110 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