Swift + 领域新手:简单领域对象及其初始化器的问题
Swift + Realm newbie: Problems with a simple Realm object and its initializers
我已经 Objective-C 开发了很长时间,几周前听说过 Realm。另一方面,我一直想一点一点地迁移到 Swift,所以我创建了一个涉及 Realm + Swift.
的小项目
这是什么意思?我是 Swift + 领域新手。
无论如何,我为我心中的项目创建了一个小的 demo/Proof 概念,我认为它必须更容易。但是 Xcode 编译器另有说明。
我的问题出在我的一个对象的初始值设定项上。
我的意图很简单,但显然 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"
}
}
我的原始代码只有 "normal" init 初始值设定项。但是 Xcode 迫使我再创建两个额外的初始化程序(值和领域)。
如果我编译上面粘贴的代码,Xcode 会在第二个和第三个必需的初始化器中抱怨,特别是在 super.init 部分。
它说:
Property 'self.id_partida' not initialized at super.init call
我明白它的意思,但我不知道如何避免错误,因为如果我删除这两行 super.init,程序会在运行时崩溃。
如果我取消对 fatalError 行的注释,它们也会在运行时崩溃。
事实上我不想使用这两个初始化器。如果可以的话,我不会添加它们,但 Xcode 显然需要添加。我真正想添加到我的对象初始化函数中的唯一代码是 "the simple" 初始化函数,这是我认为的唯一代码部分。
我想我可能对 Realm + Swift + 初始化器有一些概念上的误解。
我也觉得 Xcode 强迫我添加我不需要的代码 and/or 我也不明白。
任何帮助理解 Realm 中的 "required init" 初始化器的人都将非常受欢迎。
官方领域 + Swift 文档超出了我的知识范围,因为即使重新阅读了很多次,我也不理解其中的许多概念。
Google 和 Whosebug 这次并没有真正帮助...
谢谢。
因为它在Object
class中已经有init ()
,你使用的是Object的子class,所以你在Realm中已经有它的init
对象,你应该给你的 var init 值,比如 dynamic var id_partida: String = "id_partida_test"
,然后如果你调用 let test = Partida()
它已经有你的 2 init 值,其他 init 应该用 convenience
标记
当你将对象保存到持久存储时,它应该总是有价值的,你可以使用 Realm 的可选然后需要阅读文档
这是我的示例领域 class 这样您就明白了:
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"
}
}
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"
}
}
如果还是不行,请告诉我! :)
我已经 Objective-C 开发了很长时间,几周前听说过 Realm。另一方面,我一直想一点一点地迁移到 Swift,所以我创建了一个涉及 Realm + Swift.
的小项目这是什么意思?我是 Swift + 领域新手。
无论如何,我为我心中的项目创建了一个小的 demo/Proof 概念,我认为它必须更容易。但是 Xcode 编译器另有说明。
我的问题出在我的一个对象的初始值设定项上。
我的意图很简单,但显然 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"
}
}
我的原始代码只有 "normal" init 初始值设定项。但是 Xcode 迫使我再创建两个额外的初始化程序(值和领域)。
如果我编译上面粘贴的代码,Xcode 会在第二个和第三个必需的初始化器中抱怨,特别是在 super.init 部分。 它说:
Property 'self.id_partida' not initialized at super.init call
我明白它的意思,但我不知道如何避免错误,因为如果我删除这两行 super.init,程序会在运行时崩溃。
如果我取消对 fatalError 行的注释,它们也会在运行时崩溃。
事实上我不想使用这两个初始化器。如果可以的话,我不会添加它们,但 Xcode 显然需要添加。我真正想添加到我的对象初始化函数中的唯一代码是 "the simple" 初始化函数,这是我认为的唯一代码部分。
我想我可能对 Realm + Swift + 初始化器有一些概念上的误解。
我也觉得 Xcode 强迫我添加我不需要的代码 and/or 我也不明白。
任何帮助理解 Realm 中的 "required init" 初始化器的人都将非常受欢迎。
官方领域 + Swift 文档超出了我的知识范围,因为即使重新阅读了很多次,我也不理解其中的许多概念。
Google 和 Whosebug 这次并没有真正帮助...
谢谢。
因为它在Object
class中已经有init ()
,你使用的是Object的子class,所以你在Realm中已经有它的init
对象,你应该给你的 var init 值,比如 dynamic var id_partida: String = "id_partida_test"
,然后如果你调用 let test = Partida()
它已经有你的 2 init 值,其他 init 应该用 convenience
当你将对象保存到持久存储时,它应该总是有价值的,你可以使用 Realm 的可选然后需要阅读文档
这是我的示例领域 class 这样您就明白了:
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"
}
}
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"
}
}
如果还是不行,请告诉我! :)