使用一个条件过滤多个数组

时间:2018-03-10 08:12:05

标签: arrays swift search filter conditional-statements

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

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

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

这里是数组:

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

在tableView(cellForRowAtIndexPath方法)中:

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

这里是searchBar(textDidChange)方法:

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

现在我得到一个缩小尺寸的阵列,但所有其他阵列保持不变......是否有其他方法可以避免这个问题?我已经尝试过类型别名,但它没有用完。

我将不胜感激任何帮助!

亲切的问候,

2 个答案:

答案 0 :(得分:0)

当它进入如此大量的数组时,就会出现特定类型的时间。

简单的解决方案是创建类似

的东西
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()) }

所以总体建议是解决不同的问题(这里我建议解决让你的数据在应用问题,而不是过滤多个数组有一个条件)< / p>

答案 1 :(得分:0)

尝试

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)