Swift 1.2按关键字过滤一个Structs数组

时间:2015-07-22 18:29:00

标签: arrays swift

我需要帮助过滤一系列Structs。

这就是我目前正在做的事情,它过滤了数组,但没有正确。 例如,假设我在“Mid”中搜索数组中的项目我有一个应该显示的项目但是显示的项目以“Bad”开头。

    var array = breweries.filter() { $0.name?.lowercaseString.rangeOfString(searchController.searchBar.text.lowercaseString) != nil }

    results = array

这是我的结构

struct Breweries {
    let name: String?
    let breweryId: String?
    let distance: Double?
    let largeIconURL: String?
    let streetAddress: String?
    let locality: String?
    let region: String?
    let phone: String?
    let website: String?

    init(brewDictionary: [String: AnyObject]) {

        name = brewDictionary["brewery"]?["name"] as? String
        breweryId = brewDictionary["breweryId"] as? String
        distance = brewDictionary["distance"] as? Double
        largeIconURL = brewDictionary["brewery"]?["images"]??.objectForKey("large") as? String
        streetAddress = brewDictionary["streetAddress"] as? String
        locality = brewDictionary["locality"] as? String
        region = brewDictionary["region"] as? String
        phone = brewDictionary["phone"] as? String
        website = brewDictionary["website"] as? String


    }
}

请指出正确的方向!

注意:我使用的是Swift 1.2

更新

我认为视频有助于更好地解释我想要做的事情。

Demo Of issue

我想要的是找到过滤数组,以便只显示名称相似的项目。

更新2:事实证明,当我的UISearchController处于活动状态时,我忘了处理这个案例。

3 个答案:

答案 0 :(得分:5)

假设您的Struct名称为Breweries且其name属性,请尝试以下操作:

let array = breweries.filter() {
    ($0.name!.lowercaseString as NSString).containsString(searchController.searchBar.text.lowercaseString)
}

答案 1 :(得分:2)

您对过滤器的使用是正确的,但您的闭包似乎很复杂,没有明确的目标。我建议你写一个扩展(或者可能使用我正在使用的):

extension String {

    func contains(search: String, ignoreCase: Bool = false, ignoreDiacritic: Bool = false) -> Bool {

        var options = NSStringCompareOptions.allZeros

        if ignoreCase { options |= NSStringCompareOptions.CaseInsensitiveSearch }
        if ignoreDiacritic { options |= NSStringCompareOptions.DiacriticInsensitiveSearch }

        return self.rangeOfString(search, options: options) != nil
     }
}

这样你可以使用这样的闭包来搜索:

breweries.filter() { 
    $0.name?.contains("x") // Precise search
    $0.name?.contains("x", ignoreCase: true, ignoreDiacritics: true) // Ignores diacritics and lower / upper case
}

当然,你可以使用|或者&搜索多个参数

breweries.filter() { 
    $0.name?.contains("x") || $0.streetAddress?.contains("x")
}

希望它有所帮助!

答案 2 :(得分:0)

以下是来自具有struct的投资应用程序的示例:

import Foundation

public struct SNStock {

  public let ticker:NSString
  public let name:NSString

  init(ticker:NSString, name:NSString) {
    self.ticker = ticker
    self.name = name
  }
}

在主要主题上搜索:

public func searchStocksByKeyword(keyword:String) -> [SNStock] {
  let lowercaseKeyword = keyword.lowercaseString
  var searchResults:[SNStock] = []
  searchResults = stocks.filter({ (stock:SNStock) -> Bool in
    return stock.ticker.lowercaseString.hasPrefix(lowercaseKeyword)
  })
  if (searchResults.count == 0) {
    searchResults = stocks.filter({ (stock:SNStock) -> Bool in
      return stock.name.lowercaseString.hasPrefix(lowercaseKeyword)
    })
  }
  searchResults.sortInPlace {
    ($0.ticker as String) < ($1.ticker as String)
  }
  return searchResults;
}

在后台主题上搜索

public func searchStocksByKeyword(keyword:String, completion:(stocks:[SNStock])->()) {
  let qualityOfServiceClass = QOS_CLASS_USER_INTERACTIVE
  let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
  dispatch_async(backgroundQueue, {
    let stocks:[SNStock] = self.searchStocksByKeyword(keyword)
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
      completion(stocks: stocks)
    })
  })
}