【问题标题】:Init list values using Realm swift使用 Realm swift 初始化列表值
【发布时间】:2018-11-02 15:14:48
【问题描述】:

我正在尝试初始化几个对象,其中包括列表对象,但我不确定确切的语义是什么。是否可以从 Realm 对象中初始化 List 对象,还是必须以其他方式附加它们?

class ResourcesData: Object {
    @objc dynamic var resourceID = UUID().uuidString
    @objc dynamic var name = "";

    let valueSemantics = List<ValueSemantics>();

    convenience init(resourceName: String, semantics: List<ValueSemantics>) {
        self.init()
        self.name = resourceName
        self.valueSemantics = semantics
    }

    override static func primaryKey() -> String? {
        return "resourceID"
    }
}

带有初始化器的我的列表模型

class ValueSemantics: Object {
    @objc dynamic var name = "";
    @objc dynamic var value = 0;

    convenience init(value: Int, valueName: String) {
        self.init()
        self.name = valueName
        self.value = value
    }
}

这是我尝试初始化对象的方式,但它会引发以下错误 '&lt;' is not a postfix unary operator

let data: [ResourcesData] = [
  ResourcesData(resourceName: "Iron ore",
                semantics: List<
                  ValueSemantics(value: 0, valueName: "None"),
                  ValueSemantics(value: 1, valueName: "Average")
                  >
  ),
  ResourcesData(resourceName: "Gold ore",
                semantics: List<
                  ValueSemantics(value: 0, valueName: "None"),
                  ValueSemantics(value: 1, valueName: "Average")
                  >
  )   
];

do {
    try realm.write {
        realm.add(data);
    }
}catch {
    print("Error starting Realm! \(error)");
}

我也试过用下面的方式初始化它

ResourcesData(resourceName: "Gold ore",
                    semantics: List(
                      ValueSemantics(value: 0, valueName: "None"),
                      ValueSemantics(value: 1, valueName: "Average")
                      ))

还有

ResourcesData(resourceName: "Gold ore",
                    semantics: [
                                ValueSemantics(value: 0, valueName: "None"),
                                ValueSemantics(value: 1, valueName: "Average")])

【问题讨论】:

    标签: swift realm realm-list


    【解决方案1】:

    List 只有一个空的初始化器,所以向List 添加值的唯一方法是使用append。您最好修改 ResourcesData 的初始化程序以接受 Array 并调用 append(contentsOf:) 将数组的元素添加到列表中。

    class ResourcesData: Object {
        @objc dynamic var resourceID = UUID().uuidString
        @objc dynamic var name = ""
    
        let valueSemantics = List<ValueSemantics>()
    
        convenience init(resourceName: String, semantics: [ValueSemantics]) {
            self.init()
            self.name = resourceName
            self.valueSemantics.append(objectsIn: semantics)
        }
    
        override static func primaryKey() -> String? {
            return "resourceID"
        }
    }
    

    然后你可以像这样初始化它:

    let data: [ResourcesData] = [
      ResourcesData(resourceName: "Iron ore",
                    semantics: [ValueSemantics(value: 0, valueName: "None"),
                      ValueSemantics(value: 1, valueName: "Average")]
      ),
      ResourcesData(resourceName: "Gold ore",
                    semantics: [ValueSemantics(value: 0, valueName: "None"),
                      ValueSemantics(value: 1, valueName: "Average")]
      )   
    ]
    

    与您的问题无关,但您不应该在 Swift 中将分号放在行尾,这不是 Objective-C。

    【讨论】:

    • 谢谢大卫!这是我没有想到的。回复:分号 - 旧习惯很难改掉。正如你所看到的,我有点把它们洒在这里和那里,希望有一天如果他们被召回,我会有一组更小的线路来更新哈哈,再次感谢,伙计。
    • 我收到以下错误Extraneous argument label 'contentsOf:' in call。当我应用建议的编辑即删除“contentsOf”位时,我得到了Cannot convert value of type '[ValueSemantics]' to expected argument type 'ValueSemantics',所以最后我选择了for each loop,就像for s in semantics { self.valueSemantics.append(s)} 一样,也许你可以编辑你的答案以包括这个以供将来参考?
    • @Ando 我的错,我没记错,函数是append(objectsIn:),查看我更新的答案。无需手动遍历数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多