You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Realm 3中如何用NSPredicate过滤基本类型数组?如何存储字符串数组元素?

嘿,这两个Realm相关的问题我熟,给你一步步讲清楚怎么解决~

一、在Realm中存储字符串数组的变通方案

Realm本身不支持直接存储[String]这类基本类型的数组,所以我们得搞个小包装类来绕开这个限制——把单个字符串包装成Realm能识别的Object子类,再用List来存储这些包装对象。

完整的代码实现如下:

import RealmSwift

// 包装单个字符串的Realm对象类
class RealmString: Object {
    @objc dynamic var value = ""
    
    // 自定义便捷初始化方法,直接传字符串就能创建实例
    convenience init(value: String) {
        self.init()
        self.value = value
    }
    
    // 以下是Realm要求必须实现的初始化方法
    required init(realm: RLMRealm, schema: RLMObjectSchema) {
        super.init(realm: realm, schema: schema)
    }
    
    required init() {
        super.init()
    }
    
    required init(value: Any, schema: RLMSchema) {
        super.init(value: value, schema: schema)
    }
}

// 包含字符串数组字段的目标模型类
class Realm2Element: Object {
    // 用List<RealmString>替代原本的[String]类型
    let tags = List<RealmString>()
    
    // 可以加个便捷方法,快速把普通字符串数组转成Realm支持的结构
    func setTags(from stringArray: [String]) {
        tags.removeAll()
        stringArray.forEach { tags.append(RealmString(value: $0)) }
    }
}

使用时,你可以通过setTags(from:)快速把普通字符串数组转成Realm兼容的List结构;读取时,遍历tags列表取出每个元素的value字段,就能还原成普通数组啦。

二、Realm 3中使用NSPredicate过滤基本类型数组

因为我们用了RealmString包装类,过滤时要针对包装类的value字段写谓词,以下是几种常见的过滤场景:

  • 过滤包含指定标签的元素
    比如找出所有包含"swift"标签的Realm2Element对象:

    let predicate = NSPredicate(format: "tags.value CONTAINS %@", "swift")
    let results = realm.objects(Realm2Element.self).filter(predicate)
    
  • 过滤包含所有指定标签的元素
    比如找出同时包含"swift"和"realm"标签的对象:

    let predicate = NSPredicate(format: "ALL tags.value IN %@", ["swift", "realm"])
    let results = realm.objects(Realm2Element.self).filter(predicate)
    
  • 过滤包含任一指定标签的元素
    比如找出包含"swift"或"realm"标签的对象:

    let predicate = NSPredicate(format: "ANY tags.value IN %@", ["swift", "realm"])
    let results = realm.objects(Realm2Element.self).filter(predicate)
    
  • 过滤不包含指定标签的元素
    比如找出完全不包含"objective-c"标签的对象:

    let predicate = NSPredicate(format: "NONE tags.value == %@", "objective-c")
    let results = realm.objects(Realm2Element.self).filter(predicate)
    

要注意的是,Realm的谓词语法和普通Foundation谓词有细微区别,针对集合类型的过滤,一定要配合ALL/ANY/NONE这些限定词使用哦。

内容的提问来源于stack exchange,提问作者iOS User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:36:05