我有这样的课

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是从firebase查询的我的FoundItem类的字典中生成的。然后,我从另一个 View Controller (它是itemName函数上的集合 View )生成的didSelection字符串。我想使用该字符串,然后使用与我以前的itemNameitemName字符串相等的字符串viewController过滤或搜索数组。然后删除不等于itemName的字典数组。不仅对象,而且包含非等键,值对的整个数组。我花了好几天的时间,而我一直坚持筛选从类创建的字典数组。我已经看过并尝试过NSPredicates,for-in循环,但是最终发生的一切都是创建一个新数组或bool来查找我的值或键是相等的。这是我编写的当前函数。
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数组中的所有条目。

如果是这样,您需要做的只是:
let foundItems = found.filter { $0.itemName == filterItemName }
就是这样。

其他一些想法:

如果要搜索filterItemName中包含itemName的项目,则可以执行以下操作:
let foundItems = found.filter { $0.itemName.contains(filterItemName) }
如果要进行不区分大小写的搜索,也可以使用lowercased()函数。

您还可以将找到的元素的属性返回到数组中:
let foundIds = found.filter { $0.itemName == filterItemName }.map { $0.itemId }

关于ios - 通过字典中键的字符串值快速字典的3个过滤器数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40570716/

10-11 10:43