【问题标题】:Filter a Parse query with an Array of [AnyObject] in Swift在 Swift 中使用 [AnyObject] 数组过滤 Parse 查询
【发布时间】:2015-05-26 16:25:21
【问题描述】:

我在 Swift 中有一个 AnyObject 对象数组(最终,这个数组将通过查询 Parse 数据库来填充)。数组中的每个对象都具有出版物的属性,例如 fullTitle、url 和 journal。如何过滤数组以选择与任何值的搜索字符串匹配的所有对象(例如,fullTitle、url、期刊包括“福布斯”)?

以下是来自游乐场的示例代码。首先是样本数组:

var publication1 = [
    "fullTitle": "My first blog",
    "url": "www.forbes.com/post1",
    "journal": "Forbes
]

var publication2 = [
    "fullTitle": "My second blog",
    "url": "www.wsj.com/post1",
    "journal": "Wall Street Journal"
]

var publications: [AnyObject] = [publication1, publication2]

那么,过滤函数:

func filterContentForSearchText(searchText: String) {
    let filteredPublications = publications.filter() {
        if let fullTitle = ($0)["fullTitle"] as? String {
            return fullTitle.rangeOfString(searchText) != nil
        } else {
            return false
        }
    }
}

现在,如果我以“first”作为参数调用函数,它应该从数组中返回第一个对象:

println(filterContentForSearchText("first"))

但是,此命令没有结果。我怎样才能解决这个问题?另外,我如何查询对象的 all 字段以获取 searchText,而不仅仅是 fullTitle 字段?

谢谢。

【问题讨论】:

    标签: arrays swift filter parse-platform


    【解决方案1】:
        Swift 3.0
        This is worked for me.
        I want filter data by it's status 0 or 1. 
    
        var arrRooms:[[String:AnyObject]] = [
            [
                "id": 30 as AnyObject,
                "name": "Earth" as AnyObject,
                "status": 0 as AnyObject,
                "duration": 10 as AnyObject
            ],
            [
                "id": 27 as AnyObject,
                "name": "Mars" as AnyObject,
                "status": 1 as AnyObject,
                "duration": 0 as AnyObject
            ]
        ]
    
        let StatusPredicate = NSPredicate(format: "status = 1 ")
    
        let arrFilter:[[String:AnyObject]] = (arrRooms as NSArray).filtered(using: StatusPredicate) as! [[String : AnyObject]]
    
        print(arrFilter);
        // output [["name": Mars, "status": 1, "id": 27, "duration": 0]]
    
    it may be useful.thanks
    

    【讨论】:

      【解决方案2】:

      这是一个简单的例子,它返回所有字段中的匹配数组:

      func filterContentForSearchTextInAllFields(searchText: String) -> [String] {
          var results = [String]()
          for publication in publications {
              for (key, value) in publication {
                  if (value as NSString).containsString(searchText) {
                      results.append(value)
                  }
              }
          }
          return results
      }
      
      println(filterContentForSearchTextInAllFields("blog"))
      

      这个只适用于标题:

      func filterContentForSearchText(searchText: String) -> [String] {
          var results = [String]()
          for publication in publications {
              if let fullTitle = publication["fullTitle"] {
                  if (fullTitle as NSString).containsString(searchText) {
                      results.append(fullTitle)
                  }
              }
          }
          return results
      }
      
      println(filterContentForSearchText("first"))
      

      更新

      这是您在 cmets 中询问的版本:

      func filterContentForSearchText(searchText: String) -> [[String:String]] {
          var results = [[String:String]]()
          for publication in publications {
              if let fullTitle = publication["fullTitle"] as? String {
                  if (fullTitle as NSString).containsString(searchText) {
                      results.append(publication as! [String : String])
                  }
              }
          }
          return results
      }
      
      println(filterContentForSearchText("first"))
      

      您的“行”是字典:在循环中,我们将每个行分配给“publication”变量,因此我们只需获取标题与搜索词匹配的行,然后将其附加到字典数组中。

      【讨论】:

      • 谢谢,这行得通!它返回的是一个字符串数组。我想选择 searchText 与 fullTitle 匹配的数据库的整个“行”,而不仅仅是 fullTitle 字符串,以便我以后可以使用其他值,例如该行的 url 和 journal。你会怎么做?
      • 这非常有效!我必须将我的 var filteredPublications 更改为 AnyObject 数组,将函数的输出更改为 AnyObjects 数组,并将附加行中的发布作为字符串字典取出。
      • 一个(最终?)问题:假设我输入了“福布斯”的前三个字母,即 f、o、r。在这段代码中,每次我输入一个字符时,所有匹配的出版物都会附加到过滤的出版物中。这意味着福布斯的所有条目将被添加三次。我想要发生的是,每次我在 searchBar 中输入 additional 字符时,filteredPublications var 都会被清除,并且 只有 与 searchBar 中的所有字符匹配的出版物是附加。你是怎么做到的?感谢您的帮助,这很有帮助!
      • 我已经修复了它,添加:filteredPublications.removeAll(keepCapacity: false)
      • @TitiaanPalazzi 你在哪里添加removeAll(keepCapacity: false)
      【解决方案3】:

      这是我走的路线。我只是让 Swift 推断类型而不是 AnyObject 数组

      var publications = [publication1, publication2]
      
      func searchPublications(seachText: String) -> [[String: String]] {
         let filteredPublications = publications.filter { $0
             for (_, value) in $0 {
                 if let found = value.rangeOfString(seachText, options: NSStringCompareOptions.CaseInsensitiveSearch, range: Range<String.Index>(start: value.startIndex, end: value.endIndex), locale: NSLocale.currentLocale()) {
                     return true
                 }
             }
      
             return false
         }
      
         return filteredPublications
      }
      

      【讨论】:

      • Aahrens,这对我不起作用:"Type 'AnyObject' 不符合协议 'SequenceType'。"
      • 那是因为你声明你的出版物数组可以是任何东西。请注意我是如何让它通过作为出版物数组来推断类型的。这只是一个字典数组。
      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多