为什么我不能获得过滤的域列表的索引?

时间:2018-05-05 12:56:26

标签: swift realm

我正在尝试查找List<>中项目的索引将项目附加到它后面的对象,以便我可以插入到tableview中。

tableview的分区为.filter,所以我必须在查找indexPath之前应用过滤器。但是,过滤器似乎会破坏indexOf功能。

我注意到函数.map具有相同的效果。

import UIKit
import RealmSwift

class Model: Object {
    @objc dynamic var title: String = ""
    let items = List<Model>()
}

class ViewController: UIViewController {

    var models: Results<Model>?
    var parentModel: Model?
    var items = List<Model>()
    let realm = try! Realm()

    override func viewDidLoad() {
        super.viewDidLoad()

        if !UserDefaults.standard.bool(forKey: "IsNotFirstTime") {
            populateRealm()
            UserDefaults.standard.set(true, forKey: "IsNotFirstTime")
        }

        models = realm.objects(Model.self)

        parentModel = models!.first
        items = parentModel!.items

        let child = Model()
        child.title = "Child"

        try! realm.write {
            parentModel!.items.append(child)
        }

        print(items.index(of: child)) // prints correct value
        print(items.filter({ $0.title == "Child" }).index(of: child)) // prints nil
    }

    func populateRealm() {
        let parent = Model()
        parent.title = "Parent"
        try! realm.write {
            realm.add(parent)
        }
    }
}

第一个打印找到对象,但第二个打印没有,尽管映射没有整体效果。

奇怪的是,对象IS在过滤列表中,执行:

print(items.filter({ $0.title == "Child" }).first

返回对象,因此它就在那里。

修改

在进一步检查时,看起来它不是过滤器,但是数组类型的转换破坏了功能,在没有过滤器的情况下转换为数组会做同样的事情。

print(Array(items).index(of: child)) // prints nil

2 个答案:

答案 0 :(得分:0)

当您想要使用mapping时,您应该添加一个属性来根据它来映射您的对象,例如

    print(items.map({ $0.id }).index(of: child.id))

如果您以这种方式使用它,它将返回您的预期

答案 1 :(得分:0)

我找到了解决方案。我使用的过滤器语法>>> lst = [1,2,20,21,22] >>> avg_dst = sum(abs(a-b) for a, b in zip(lst, lst[1:])) / (len(lst)-1) >>> [i for i in range(1, len(lst)) if abs(lst[i] - lst[i-1]) > avg_dst] [2] 不是Realm过滤器,并将List转换为.filter({ $0.title == "Child" }),它似乎与搜索域对象的索引不兼容。

修复方法是使用格式LazyFilterCollection<List<Model>>,它返回领域结果对象。