Swift + Realm新手:一个简单的Realm对象及其初始化器的问题

Isa*_*aac 7 xcode initializer realm ios swift

几周前我一直是Objective-C的开发人员,并且听说过Realm.另一方面,我一直希望一点一点地迁移到Swift,所以我创建了一个涉及Realm + Swift的小项目.

这是什么意思?我是Swift + Realm的新手.

无论如何,我为我想到的项目创建了一个小型演示/概念证明,我认为它必须更容易.但是Xcode编译器说不然.

我的问题是我的一个对象的初始化程序.

我的意图很简单,但显然Realm需要的初始化程度比我想要的要多.

我的一个Realm对象的代码是这样的:

import Foundation

import Realm
import RealmSwift

class Partida: Object
{
    dynamic var id_partida: String
    dynamic var inventario: Inventory?

    required init ()
    {
        inventario = Inventory()
        id_partida = "id_partida_test"
        super.init()
    }



    required init(value: AnyObject, schema: RLMSchema) {
        //fatalError("init(value:schema:) has not been implemented")
        super.init(value: value, schema: schema)
    }


    required init(realm: RLMRealm, schema: RLMObjectSchema) {
        //fatalError("init(realm:schema:) has not been implemented")
        super.init(realm: realm, schema: schema)
    }

    override class func primaryKey() -> String? {
        return "id_partida"
    }

}
Run Code Online (Sandbox Code Playgroud)

我的原始代码只有"普通"初始化器.但Xcode迫使我更多地创建两个额外的初始化器(value和realm).

如果我编译上面刚刚粘贴的代码,Xcode会在第2和第3个必需的初始化程序中抱怨,特别是在super.init部分.它说:

Property 'self.id_partida' not initialized at super.init call
Run Code Online (Sandbox Code Playgroud)

我理解它的含义,但我不知道如何避免错误,因为如果我删除两个super.init行,程序在运行时崩溃.

如果我取消注释fatalError行,它们也会在运行时崩溃.

实际上我不想使用这两个初始化器.如果可以,我不会添加它们,但显然需要Xcode.我真正想要添加到我的对象init函数的唯一代码是"简单的"init函数,这是我认为的唯一代码部分.

我想我可能在Realm + Swift +初始化器中有一些概念误解.

我也有感觉Xcode迫使我添加我不需要的代码和/或我也不理解.

任何有关理解Realm中"required init"初始值设定项的帮助都将非常受欢迎.

官方领域+ Swift文档是我所不知道的,因为即使多次重读它们之后我也不理解它的许多概念.

谷歌和StackOverflow这次没有真正帮助...

谢谢.

TiM*_*TiM 7

Swift中的初始化器肯定与Objective-C有点不同,所以我绝对可以看到你来自这里的角度.

但在这种情况下,由于您只是使用初始化程序来设置一些默认值,因此您完全没有必要,因为您应该能够将默认值分配给属性本身:

class Partida: Object
{
    dynamic var id_partida = "id_partida_test"
    dynamic var inventario: Inventory? = Inventory()

    override class func primaryKey() -> String? {
        return "id_partida"
    }

}
Run Code Online (Sandbox Code Playgroud)

如果仍然无效,请告诉我!:)


Tj3*_*j3n 5

因为它已经init ()Object类中,你正在使用Object的子类,所以你已经拥有了它init的Realm对象,你应该给你的var init值,dynamic var id_partida: String = "id_partida_test"然后如果你调用let test = Partida()它已经有你的2 init值,其他init应该是标有方便

当您将Object保存到持久存储时,它应该始终具有值,您可以使用Realm的可选,然后需要阅读文档

这是我的示例Realm类,所以你有了这个想法:

import Foundation
import RealmSwift
import SwiftyJSON

class ProjectModel: Object {
    dynamic var id: Int = 0
    dynamic var name: String = ""

    //Dont need this, call init() already have value
    required init() {
       id = 0
       name = ""
       super.init()
    }

    convenience init(fromJson json: JSON!){
        self.init()

        if json == nil {
            return
        }

        id = json["id"].intValue
        name = json["name"].stringValue
    }

    override class func primaryKey() -> String? {
        return "id"
    }
}
Run Code Online (Sandbox Code Playgroud)