我试图在将项目附加到 List<> 对象后找到该项目的索引,以便我可以插入到 TableView 中。
表格 View 用.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)
}
}
}
第一个打印找到了对象,但第二个打印没有找到该对象,尽管映射没有整体效果。
奇怪的是,该对象在过滤列表中,正在执行:
print(items.filter({ $0.title == "Child" }).first
返回对象,因此它就在那里。
编辑
经过进一步检查,看起来不是过滤器而是数组类型的转换破坏了功能,在没有过滤器的情况下转换为数组也会做同样的事情。
print(Array(items).index(of: child)) // prints nil
最佳答案
当您想使用mapping时例如,您应该添加一个属性来根据它映射您的对象
print(items.map({ $0.id }).index(of: child.id))
如果你以这种方式使用它,它将返回你期望的结果
关于swift - 为什么我无法获取过滤后的 Realm 列表的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50189689/