代码之家  ›  专栏  ›  技术社区  ›  Dom

使用一个条件筛选多个阵列

  •  0
  • Dom  · 技术社区  · 7 年前

    我有一个包含不同类型信息的tableView,每个信息来自不同的数组。

    我无法使用字典,因为这样列表就会无序,我无法使用类,因为我有不同的列表,其中包含各种动态条目(属性总是不同的等等)

    我的问题是: 我想实现一个搜索功能。但当我对一个数组使用filter函数时,它当然会根据实现的条件而改变,但其他5个保持不变=>我无法重新加载tableView,因为数组信息不再匹配。。。

    这里是阵列:

    var categoryItemUIDs = [String]()
    var categoryItemDescriptions = [String]()
    var categoryItemLfdNrs = [Int]()
    var categoryGivenOuts = [Bool]()
    var categoryGivenTos = [String]()
    var categoryGivenAts = [String]()
    var categoryStorageLocations = [String]()
    

    在tableView中(CellForRowatingIndexPath方法):

     cell.customTextLabel?.text = categoryItemLfdNrs[indexPath.row]
     cell.customDetailTextLabel.text = categoryItemDescriptions[indexPath.row]
    

    这里是搜索栏(textDidChange)方法:

    self.categoryItemDescriptions.filter { $0.lowercased().contains(searchText.lowercased()) }
    

    现在我得到了一个缩小了大小的数组,但所有其他数组都保持不变。。。有没有其他方法可以避免这个问题?我已经尝试过输入别名,但没有成功。

    如果有任何帮助,我将不胜感激!

    谨致问候,

    2 回复  |  直到 7 年前
        1
  •  0
  •   SwiftStudier    7 年前

    当涉及到如此多的数组时,就需要使用特定类型了。

    简单的解决方案是创建

    struct Category {
      var uid: String
      var description: String
      // ...
      var storageLocation: String
    }
    

    你有一些简单的东西

    var items: [Category]
    

    你仍然可以在 cellForRowAtIndexPath

    cell.customTextLabel?.text = items[indexPath.row].lfdnrs
    cell.customDetailTextLabel.text = items[indexPath.row].description
    

    只需过滤1个数组

    items.filter { $0.description.lowercased().contains(searchText.lowercased()) }
    

    所以总体建议是解决不同的问题(这里我建议 在应用程序中包含您的数据 问题而不是 使用一个条件筛选多个阵列 )

        2
  •  0
  •   thierryH    7 年前

    尝试

    var categoryItemUIDs = ["aaa","bbb","ccc"]
    var categoryItemDescriptions = ["ddd","eee","fff"]
    var categoryItemLfdNrs = [0,1,2]
    
    struct data {
        var id = ""
        var desc = ""
        var item = 0
    
        init(id :String, desc:String, item:Int)
        {
            self.id = id
            self.desc = desc
            self.item = item
    
        }
    }
    
    //var cat = [data]()
    //for  i in 0..<categoryItemUIDs.count {
    //    cat.append(data(id:categoryItemUIDs[i], desc:categoryItemDescriptions[i],item:categoryItemLfdNrs[i] ))
    //}
    
    //more swift
    let cat = (0..<categoryItemUIDs.count).map { (i) -> data in
        return data(id:categoryItemUIDs[i], desc:categoryItemDescriptions[i],item:categoryItemLfdNrs[i] )
    }
    
    
    print (cat)
    
    let catFilter = cat.filter { $0.id ==  "aaa" }
    print (catFilter)