我有这样的课
class FoundItem : NSObject { var id : String! var itemName : String! var itemId : Int! var foundBy : String! var timeFound : String! init(id: String, itemName: String, itemId: Int, foundBy: String, timeFound: String) { self.id = id self.itemName = itemName self.itemId = itemId self.foundBy = foundBy self.timeFound = timeFound }
我在我的参考
class MapViewVC: UIViewController, MKMapViewDelegate { var found = [FoundItem]() var filterItemName : String() }
我的FoundItem是根据FoundItemFirebase查询的类生成的字典数组。然后,我得到了itemName从另一个视图控制器(该didSelection函数是集合视图)生成的字符串。我想获取该字符串,然后使用与我之前itemName的itemName字符串相等的字符串过滤或搜索数组viewController。然后删除不等于itemName。不仅对象,而且包含非等键,值对的整个数组。我已经找了几天了,但我坚持过滤从类创建的字典数组。我已经看过并尝试过NSPredicates,for- in循环,但是最终发生的一切都是创建一个新数组或bool来查找我的值或键相等。这是我编写的当前函数。
FoundItem
itemName
didSelection
viewController
func filterArrayBySearch() { if self.filterItemName != nil { dump(found) let namePredicate = NSPredicate(format: "itemName like %@", "\(filterItemName)") let nameFilter = found.filter { namePredicate.evaluate(with: $0) } var crossRefNames = [String: [FoundItem]]() for nameItemArr in found { let listName = nameItem.itemName let key = listName if crossRefNames.index(forKey: key!) != nil { crossRefNames[key!]?.append(nameItemArr) if !("\(key)" == "\(filterItemName!)") { print("------------- Success have found [[[[[[ \(key!) ]]]]]] and \(filterItemName!) to be equal!!") // crossRefNames[key!]?.append(nameItemArr) } else { print("!! Could not find if \(key!) and \(filterItemName!) are equal !!") } } else { crossRefNames[key!] = [nameItemArr] } } } else { print("No Data from Search/FilterVC Controller") } }
有人可以帮忙吗?似乎很容易找到值,然后过滤出不等于itemName字符串的字典,但是我一直在碰壁。然后自己进入for- in循环:P尝试不同的事情来实现相同的任务。
希望我能理解您的要求。您提到了“字典数组”,但实际上您发布的代码中的任何地方都没有字典数组。
据我所知,您正在询问如何查找found数组中itemName等于该filterItemName属性的所有条目。
found
filterItemName
如果是这样,您需要做的只是:
let foundItems = found.filter { $0.itemName == filterItemName }
而已。
其他一些想法:
如果你想搜索其中的项目filterItemName包含在itemName,你可以这样做:
let foundItems = found.filter { $0.itemName.contains(filterItemName) }
lowercased()如果要进行不区分大小写的搜索,也可以使用该功能。
lowercased()
您还可以将找到的元素的属性返回到数组中:
let foundIds = found.filter { $0.itemName == filterItemName }.map { $0.itemId }