Swift与Objective-C混编项目中,如何正确声明Realm的RLMArray?
解决Swift中Objective-C版Realm的RLMArray声明问题
嘿,刚好我在Objective-C和Swift混编的Realm项目里踩过这个坑,你的报错根源是RLMArray在Objective-C版Realm的Swift代码里有特殊的声明规则,不能像你那样直接写可选的泛型数组。
先给你看修正后的正确代码:
@objcMembers class KTPRestaurant: RLMObject { dynamic var name: String? // 核心:用指定元素类名的方式初始化RLMArray,不能声明为可选类型 dynamic var tables = RLMArray(objectClassName: KTPTable.className()) }
再给你拆解几个关键注意点:
- 不能用可选类型:Objective-C版的Realm要求RLMArray属性必须是已初始化的实例,不能声明成
RLMArray<KTPTable>?,因为Realm需要直接管理这个数组的内存和持久化逻辑,可选类型会让它无法正确识别。 - 正确的初始化方式:必须通过
RLMArray(objectClassName:)构造方法来创建实例,传入元素类的类名(用className()方法获取是最稳妥的,避免字符串写错)。 - 确保元素类的可见性:
KTPTable必须也是继承自RLMObject的类,并且同样用@objcMembers修饰(或者至少用@objc标记),保证Objective-C能识别到这个类,否则Realm会找不到对应的元素类型。
另外补充一下,@objcMembers已经为所有成员变量自动添加了@objc和dynamic特性,所以其实你可以把代码里的dynamic去掉,写成这样也完全没问题:
@objcMembers class KTPRestaurant: RLMObject { var name: String? var tables = RLMArray(objectClassName: KTPTable.className()) }
内容的提问来源于stack exchange,提问作者user4992124
相关产品推荐
相关产品推荐

