使用 RealmSwift 使类符合协议

Conforming class to protocol using RealmSwift

提问人:MjDev 提问时间:9/24/2023 最后编辑:MjDev 更新时间:11/18/2023 访问量:55

问:

我已经定义了一个具有类型属性的属性。该协议是在框架中定义的,因此我也可以在我的 AppClip 版本中使用它。protocol ExampleProtocolexampleArray[Stuff]

Stuff是另一个协议。

这是我的协议:

public protocol ExampleProtocol {  
    var exampleArray: [Stuff] { get set }
}

我用于本地存储,并且我创建了一个符合 .但是,我遇到一个错误,指出“类型'Example'不符合协议'ExampleProtocol'。如何解决此问题?RealmSwiftExampleExampleProtocol

类与 Realm:

class Example: Object, Identifiable, ExampleProtocol {
    @Persisted var id = UUID().uuidString
    var exampleArray = List<Stuff>()
}

其中 AppClip 中的类定义不同:

class ExampleAppClip: Identifiable, ExampleProtocol {
    var id = UUID().uuidString
    var exampleArray = [Stuff]()
}

我将不胜感激有关如何修复此错误并确保我的类正确符合协议的任何见解或建议。

迅捷 领域

评论

0赞 Jay 9/24/2023
@TayyabMubeen的好答案。目前尚不清楚为什么代码是这样编写的。你已经定义了一个协议,要求符合要求的类有一个 Array,但该类不符合该协议,因为它使用了 RealmSwift.List,这是两个截然不同的东西。此外,这不是使用持久化 Realm List 的方法,它应该是 .也许如果你能更新关于为什么要这样做以及你试图做什么的问题,我们可能会提供更多帮助。[Stuff]<Stuff>()var exampleArray = List<Stuff>()@Persisted var exampleList = RealmSwift.List<Stuff>()

答:

1赞 Tayyab Mubeen 9/24/2023 #1

在你的协议中,你定义了简单的 stuff 类型数组,但 array 和 List of Realm 是两种不同的类型。您需要在协议和轻 App 类中更改它。

public protocol ExampleProtocol {  
    var exampleArray: List<Stuff> { get set }
}

并像

class ExampleAppClip: Identifiable, ExampleProtocol {
    var id = UUID().uuidString
    var exampleArray = List<Stuff>()
}

评论

0赞 MjDev 9/24/2023
谢谢你的回答。我想避免将 Realm 合并到我的框架和 AppClip 中。其次,值得注意的是,Stuff 是一个不符合“RealmCollectionValue”的协议。
0赞 Tayyab Mubeen 9/24/2023
那么我认为单例类会更好,这样做的一个好处是它在内存中只有一个列表!
0赞 Jay 9/24/2023
@MjDev 我想避免合并 Realm 的评论有点令人困惑,因为代码将 a 合并为属性,即 Realm。如果你想避免在任何容量中使用 Realm,那应该是一个 Array,当然,你失去了持久化数据的选项。你能澄清一下(问题)意图是什么吗?RealmSwift.List
0赞 MjDev 9/24/2023
@Jay我的项目中有三个目标:主应用程序、AppClip 和框架。在主应用程序中,我实现了 RealmSwift 用于数据存储。但是,对于 AppClip 和框架,我的目标是完全避免使用 Realm。
0赞 Jay 9/24/2023
@MjDev 如果你没有在其他对象中使用 Realm,那么 Protocol 应该只针对其他对象。例如,该协议是为了统一性和一致性,而 Example Realm 对象与此不匹配,实际上具有完全不同的功能(它是持久的,而其他对象则不是),因此它根本不应该符合该协议。