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
相关产品推荐
相关产品推荐

