这是我的对象/模型
import RealmSwift
class IBPChapters: Object {
@objc dynamic var ibp_chapter_id = 0
@objc dynamic var chapter = ""
@objc dynamic var chapter_president = ""
@objc dynamic var office_no = ""
@objc dynamic var email_address = ""
@objc dynamic var services_offered = ""
var service = List<Services>()
@objc dynamic var locid = 0
@objc dynamic var loc:Locations?
@objc dynamic var status = 0
override static func primaryKey() -> String {
return "ibp_chapter_id"
}
}
服务模式
import RealmSwift
class Services: Object{
@objc dynamic var service_id = 0
@objc dynamic var service = ""
@objc dynamic var status = 0
@objc dynamic var ibp_service_filter = true
@objc dynamic var pao_service_filter = true
@objc dynamic var lac_service_filter = true
override static func primaryKey() -> String {
return "service_id"
}
}
示例数据
1. legal aid,outreach,counseling,case handling
2. legal aid,counseling
3. outreach,counseling
附加数据
if Chapter.service[0].ibp_service_filter == true
,附加所有具有法律援助的数据
输出将为1和2
//预期输出
如果chapter.service[1].ibp_service_filter == true
,则附加所有具有咨询的数据,但如果id已经存在,则忽略该索引并继续下一个数据
输出将为1和2和3
//预期输出
func addData(){
var ibpArray:[IBPChapters] = []
let chapters = realm.objects(IBPChapters.self)//condition for filter here
for chapter in chapters{
print(chapter.service)
ibpArray.append(chapter)
//Legal Aid service[0]
if chapter.service[0].ibp_service_filter == true{
ibpArray.append(chapter)
}
//Counseling service[1]
if chapter.service[1].ibp_service_filter == true{
ibpArray.append(chapter)
}
//Outreach service[2]
if chapter.service[2].ibp_service_filter == true{
ibpArray.append(chapter)
}
//Case Handling service[3]
if chapter.service[3].ibp_service_filter == true{
ibpArray.append(chapter)
}
}
}
我的输出 1,2,3,1,2,3,1,2,3,1,2,3
//<- 错误输出
只有1和2
有法律援助,所有1,2和3
都有咨询服务,所以我不需要附加1和2
再次,因为我已经将它们附加到第一个循环的数组中
我如何访问我的过滤器 Realm 的列表,以便我可以操纵数据,或者您有任何想法或替代方法来生成我的预期输出
我可以使用数组索引来过滤吗? 例如。 .filter("services[0].ibp.filtered == true)
正确输出
func addData(){
let chapters = realm.objects(IBPChapters.self)
for chapter in chapters{
let filteredServices = chapter.service.filter("ibp_service_filter == true")
for service in filteredServices{
let service_index = filteredServices.index(of: service)
if chapter.service.contains(filteredServices[service_index!]){
if !ibpArray.contains(where: {$0.ibp_chapter_id == chapter.ibp_chapter_id}){
ibpArray.append(chapter)
}
}
}
}
}
但我仍然想知道是否有更好的答案或比我的答案更短,或者可以说更少的循环和条件
最佳答案
Realm
支持 .filter()
基于NSPredicate
的函数。因此,首先您应该获得 ibp_service_filter == true
值:
let filteredServices = chapter.service.filter("ibp_service_filter == true")
然后仅保存 uniq id(基本思想):
for service in filteredServices where !history_ibp.contains(where: { $0. service_id == service.service_id }) {
history_ibp.append(service)
}
关于ios - 如何在 swift 4 中访问过滤器中的 Realm 模型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379353/