我正在尝试查找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
答案 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>>
,它返回领域结果对象。