【问题标题】:Using Realm Swift with initializers throws constant errors将 Realm Swift 与初始化程序一起使用会引发持续错误
【发布时间】:2015-10-28 16:51:30
【问题描述】:

Xcode 7.1 和 Swift 2.1 以及最新的 Realm Swift 0.96.2

我为 Realm 创建了一个模型类,但它不断抛出有关初始化的错误。我在一定程度上了解子类的初始化程序,但我无法理解这一点以及它失败的原因。这是我制作的课程:

import UIKit
import RealmSwift

class Boxes: Object {

    dynamic var precessor: String = "B";
    dynamic var id: Int = 0;
    dynamic var boxNumber: String {
        return "\(precessor) \(id)";  //computed property
    }
    dynamic var boxDescription: String? = "";
    dynamic var brand: String? = "";
    dynamic let dateCreated: NSDate
    dynamic var dateUpdated: NSDate?
    dynamic var photo: UIImage?
    dynamic var tags: NSArray? = [];

    override static func primaryKey() -> String? {
        return "id";  //sets primary key of the model
    }

    init(precessor: String, id: Int, description: String, brand: String, dateCreated: NSDate, dateUpdated: NSDate) {
        self.precessor = precessor;
        self.boxDescription = description;
        self.brand = brand;
        self.dateUpdated = dateUpdated;
        self.dateCreated = dateCreated;

        super.init();
    }
}

当我尝试时这不会建立,它告诉我:

'required' initializer 'init()' must be provided by subclass of 'Object'

我需要添加这一行:

required init() {
        fatalError("init() has not been implemented")
    }

这足以让编译器让我构建项目。但是,当我运行该项目时,它总是出错并在输出中给我 fatalError 行。我知道它是作为最后的初始化程序这样做的,但我不知道为什么。

这是否与我在某处缺少的超级初始化程序有关?我对 swift 比较陌生,但如果我不使用 Object 子类化我的类,我可以让我的初始化程序工作。

【问题讨论】:

  • 我认为您需要查看有关领域的文档,了解您可以对 Object 子类中的属性做什么和不能做什么。例如我不认为它会支持UIImageNSArray...
  • 我会仔细检查,但我被告知 CoreData 不会持有 UIImage 并建议改用 Realm。谢谢!
  • 您可能需要先将图像转换为NSData,因为这是受支持的。虽然“NSData 属性不能容纳超过 16MB 的数据。”
  • 一旦我通过了初始化错误,我收到了那些确切问题(数组和图像)的运行时错误。现在我已经删除了数组并将图像更改为 NSData。感谢您的信息和帮助!

标签: ios swift realm


【解决方案1】:

你需要实现init(),但Xcode不知道如何为你实现,所以它会输入fatalError("init() has not been implemented")来提醒你实现它。

您可能只想调用 super。所以:

required init() {
    super.init()
}

【讨论】:

  • 我认为这应该是正确的答案。也可以为所有属性添加默认值来解决此问题。
  • 我不是领域专家,但我认为dynamic let dateCreated : NSDate 无效。来自文档“除了 List 和 RealmOptional 之外的所有属性类型都必须声明为动态变量”
  • 这确实有效,但我最终不得不为我的所有属性添加默认值,否则我会得到一个property self.xxx not initialized at super.init call。非常感谢!我想我还有很多关于初始化程序的内容要阅读。
  • 这在我的情况下不起作用,你能看看这里吗? stackoverflow.com/questions/36824202/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多