2017-09-13 55 views
0

我想不出如何正确创建第一个return。它会这样工作,但问题是searchtestarrayone总是有不同的长度,它可能会相当大。几周前我开始了与Swift的旅程,所以在下面的代码中可能会有些愚蠢的事情,答案很明显,请原谅我。通过检查列表是否包含其他列表的元素进行过滤。怎么做?

func updateSearchResults(for searchController: UISearchController){ 

    if let searchText = searchController.searchBar.text, !searchText.isEmpty {   
     transformSearchResult() 

     filteredBusStopsArray = busStopsArray.filter { (busstop : BusStop) in 

      if !searchtestarrayone.isEmpty{ 
       return busstop.stopName.lowercased().contains(searchtestarrayone[0]) || busstop.stopName.lowercased().contains(searchtestarrayone[1]) 
      } 
      else{ 
       return busstop.stopName.lowercased().contains(searchText.lowercased()) 
      } 

寻找一些提示。最好的祝福。

+0

“searchtestarrayone”的作用是什么? – Wukerplank

+0

它是包含字母组合的数组,例如当您在搜索栏中输入“aa”时,数组将填充“aa”,“aą”,“ąa”,“±”。一般来说,这应该是为了提高搜索波兰语词汇。 – Kickd

回答

0

如果你想返回busstop.stopName是否包含任何searchtestarrayone的值的值,你可以使用contains.where

if !searchtestarrayone.isEmpty{ 
    return searchTestArrayOne.contains(where: {busStop.stopName.lowercased().contains($0)}) 
} 

如果任何searchTestArrayOne元素都包含在busStop.stopName和假否则这将返回true。 contains(where:)只要找到与闭包匹配的第一个元素,它也会提前退出,因此如果没有匹配,那么他的全搜索数组只会被迭代。

另请确保您符合Swift命名约定,该约定是函数和变量名称的lower-camelCase。

0

您应该将busStopsArray映射为仅包含小写停止名称并使用searchtestarrayone进行过滤。

filteredBusStopsArray = (busStopsArray.map { $0.stopName.lowercased() }).filter { 
    searchtestarrayone.contains($0) 
} 
相关问题