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

Objective-C中Realm使用RLMArray报错:value is not enumerable如何解决?

解决Realm中RLMArray赋值的"value is not enumerable"错误

看起来你踩了Realm在Objective-C中使用RLMArray的一个常见坑——直接给RLMArray属性赋值普通NSArray肯定会报错,因为RLMArray是Realm自己实现的数组类型,和NSArray不是一回事儿。咱们一步步来解决这个问题:

第一步:补全Signer类的必要声明

你已经定义了Signer类,但还缺一个关键的宏,用来告诉Realm这个类可以作为RLMArray的元素类型。在Signer的头文件里加上RLM_ARRAY_TYPE(Signer):

// Signer.h
#import <Realm/Realm.h>

@interface Signer : RLMObject
@property NSString *name;
@end

// 必须添加这个宏,注册Signer作为RLMArray的合法元素类型
RLM_ARRAY_TYPE(Signer)

这个宏是Realm用来识别RLMArray元素类型的关键,没加的话Realm可能无法正确解析你的数组属性。

第二步:正确给RLMArray属性赋值

报错的核心原因是你把普通的NSArray(也就是你的documentsToSign)直接赋值给了RLMArray类型的signers属性。RLMArray不接受普通NSArray,你需要把NSArray里的每个NSString转换成Signer对象,再添加到RLMArray中。

举个具体的例子:假设你有一个存着签名者名字的普通NSArray:

NSArray *documentSignerNames = @[@"张三", @"李四", @"王五"];

方式一:手动循环创建Signer并添加

// 获取默认Realm实例
RLMRealm *realm = [RLMRealm defaultRealm];

// 创建你的Document对象
Document *myDocument = [[Document alloc] init];

// 初始化一个空的RLMArray,指定元素类型为Signer
RLMArray<Signer *> *signerArray = [[RLMArray alloc] initWithObjectClassName:@"Signer"];

// 循环把NSString转成Signer对象,添加到RLMArray中
for (NSString *name in documentSignerNames) {
    Signer *signer = [[Signer alloc] init];
    signer.name = name;
    [signerArray addObject:signer];
}

// 把RLMArray赋值给document的signers属性
myDocument.signers = signerArray;

// 在事务中写入Realm
[realm transactionWithBlock:^{
    [realm addObject:myDocument];
}];

方式二:在事务中直接添加更简洁

其实你也可以不用提前初始化RLMArray,直接在事务中给document的signers属性添加元素:

[realm transactionWithBlock:^{
    Document *myDocument = [[Document alloc] init];
    for (NSString *name in documentSignerNames) {
        Signer *signer = [[Signer alloc] init];
        signer.name = name;
        // 直接通过addObject方法添加到signers属性里,Realm会自动管理RLMArray
        [myDocument.signers addObject:signer];
    }
    [realm addObject:myDocument];
}];

为什么会报"value is not enumerable"?

这个错误的意思是:你传给Document.signers的值(也就是你的documentsToSign)不是Realm能识别的可枚举类型。RLMArray只接受自己的实例,或者通过它的API添加元素,普通NSArray不在它的可接受范围内,所以就抛出了这个异常。

额外注意点

  • 你的signers属性用assign修饰是对的,因为Realm会自己管理对象的内存,不需要用strong。
  • 所有修改Realm对象的操作都必须在事务中进行,否则会报错。

内容的提问来源于stack exchange,提问作者Jaime Alcántara Arnela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:57:22