当前位置: 首页 > 面试题库 >

如何快速保存结构?

顾炎彬
2023-03-14
问题内容

通过从继承可以很容易地将Realm与类一起使用Object。但是我如何将struct包含几个字段的a保存到Swift中呢?例如

struct DataModel {
    var id = 0
    var test = "test"
}

我知道文档中明确支持的类型。但是也许有一个不错的解决方法,或者甚至更好-来自领域的人可以写有关结构的未来计划。


问题答案:

我建议您使用协议,以实现所需的功能。

1)创建您的结构

struct Character {
    public let identifier: Int
    public let name: String
    public let realName: String
}

2)创建您的领域对象

final class CharacterObject: Object {
    dynamic var identifier = 0
    dynamic var name = ""
    dynamic var realName = ""
    override static func primaryKey() -> String? {
        return "identifier"
    }
}

3)使用协议将我们的结构转换为Realm对象

public protocol Persistable {
    associatedtype ManagedObject: RealmSwift.Object
    init(managedObject: ManagedObject)
    func managedObject() -> ManagedObject
}

4)使您的结构持久

extension Character: Persistable {
    public init(managedObject: CharacterObject) {
        identifier = managedObject.identifier
        name = managedObject.name
        realName = managedObject.realName
    }
    public func managedObject() -> CharacterObject {
        let character = CharacterObject()
        character.identifier = identifier
        character.name = name
        character.realName = realName
        return character
    }
}

有了这些工具,我们就可以实现持久层的插入方法了。

5)以写数据为例

public final class WriteTransaction {
    private let realm: Realm
    internal init(realm: Realm) {
        self.realm = realm
    }
    public func add<T: Persistable>(_ value: T, update: Bool) {
        realm.add(value.managedObject(), update: update)
    }
}

// Implement the Container
public final class Container { 
    private let realm: Realm
    public convenience init() throws {
        try self.init(realm: Realm())
    }
    internal init(realm: Realm) {
        self.realm = realm
    }
    public func write(_ block: (WriteTransaction) throws -> Void) 
    throws {
        let transaction = WriteTransaction(realm: realm)
        try realm.write {
            try block(transaction)
        }
    }
}

5)使用魔术!

let character = Character(
    identifier: 1000,
    name: "Spiderman",
    realName: "Peter Parker"
)
let container = try! Container()
try! container.write { transaction in
    transaction.add(character)
}

惊人的来源:将领域与值类型和我的文章一起使用



 类似资料:
  • 问题内容: 这是我定义的一个类: 这就是我尝试保存s 数组的方式: 它没有用,这是我在控制台上看到的: 我是iOS新手,您能帮我吗? 第二版 我找到了一种保存数据的解决方案: 但是在使用以下代码加载数据时出现错误: 错误是: 我很确定我存档了Double,保存/加载过程存在问题 有什么线索吗? 问题答案: 从属性列表编程指南中: 如果属性列表对象是容器(即数组或字典),则其中包含的所有对象也必须是

  • 问题内容: 我刚刚在我的应用程序中创建了PDF文档,并且希望通过“文件”应用程序可以访问保存的文档的方式将文档保存在设备上。 当您在Safari中下载PDF文档时,可以选择将文档保存到“文件”应用中。 我用Google搜索了几个小时,但找不到任何有用的方法。 问题答案: 如果您有权访问,则可以向用户显示,然后将其保存到,或与其他任何可用选项共享该用户:

  • 本文向大家介绍MySQL如何快速修改表的表结构,包括了MySQL如何快速修改表的表结构的使用技巧和注意事项,需要的朋友参考一下 快速修改MySQL某张表的表结构--摘录自《MySQL管理之道》 这个命令可以修改表结构 此外,也可以如下方法修改表结构: 先创建一张表,如下: 如果要修改name列为varchar(10)的,可以这样操作: 也可以如下操作: 1、查看表结构,如下: 2、创建临时表,把v

  • 我想将PayPalExpress Checkout与OmniPay集成,但留档完全未完成。我如何运行方法,如setExpressCheckout,doExpressCheckout和getExpressCheckout?此外,如何将所有PayPal呼叫重定向到IPN监听器?OmniPay提供所有这些方法还是只是其中的一部分?有人有机会使用这个库与快速结账? 问候!

  • 问题内容: 我需要创建一个数组来添加具有这种格式的对象,例如Swift中的字典:[“ key1”:“ value1”,“ key2”:“ value2”] 当我尝试全部保存时是正确的,但是使用键读取时会崩溃。var obj需要什么类型的数据? 问题答案: 这个问题的意思是“数组数组”,但是我想大多数人可能只是想知道如何将数组保存到。对于那些人,我将添加一些常见示例。 保存数组 检索数组 整数数组

  • 问题内容: 我想优化我的Dockerfile。我希望将缓存文件保留在磁盘中。但是,我发现当我运行它时,总是尝试从网络获取每个文件。 我希望在构建期间共享我的缓存目录(例如/ var / cache / yum / x86_64 / 6)。但是,它仅适用于。 有什么建议吗?(在此示例中,仅安装了1 rpm,在实际情况下,我需要安装数百rpm) 我的Dockerfile草案 在第二次,我想建立一个相似