2014-12-04 49 views
1

这里是我的类:如何解决这个错误?:“使用未实现初始的‘的init()’类”

class Sentence: RLMObject { 
    dynamic var words = RLMArray(objectClassName: Word.className()) 
    dynamic var content = "" 

    init(content: String){ 
     super.init(object: content) 
     self.content = content 
     let wordArray = makeWordTokens(content) 
    } 

当我尝试创建一个像这样的句子对象...

let sentence = Sentence(content: "你好吗?") 

...我得到以下运行时错误:

fatal error: use of unimplemented initializer 'init()' for class 'MyApp.Sentence' 

为什么它告诉我,我还没有实现初始化?我应该怎么做才能解决这个问题?

+0

你能提供一个最小的,但* full *再现的例子吗? – 2014-12-04 13:18:04

+0

我,小白,很抱歉,但我不太了解你的要求。你还需要看什么? – webmagnets 2014-12-04 13:19:47

+0

嗯,我不能把你的代码粘贴到游乐场来重现问题,因为我不知道RLMObject,RLMArray,makeWordTokens等等。让人们来帮助你的最好方式是缩小你的范围问题的最简单的例子,其他人可以很容易地在他们的机器上复制。应该不会太难,拿出你所拥有的东西,删掉任何与问题无关的东西,并在一小段代码中完整地复制。 (另外,在做这件事的时候,你经常会弄清楚自己有什么问题。)有关更多信息,请参阅http://sscce.org。 – 2014-12-04 13:22:12

回答

2

当您实现指定的初始值设定项时,子类不会继承超类指定的初始值设定项。见the docs

RLMObjectinit(object:)calls self.init()

- (instancetype)initWithObject:(id)value { 
    self = [self init]; 

Sentence不继承init()初始化。这就是你看到错误的原因。

我觉得convenience initializer解决您的问题:

class Sentence: RLMObject { 

    convenience init(content: String){ 
// ^^^^^^^^^^^^ 
     self.init(object: content) 
//  ^^^^^ 

     ... 
    } 

    ... 
} 
+0

这有些帮助。谢谢。现在我收到另外一个错误:'''由于未捕获的异常'RLMException'导致终止应用程序,原因:'对于属性'content'''''无效的值''如果我们刚初始化它,它怎么能为null? – webmagnets 2014-12-04 13:46:48

+0

这与这个问题没有关系。我不知道,因为我从来没有使用过Realm.io。但是,我认为'init(object:)'预计'NSArray'或'NSDictionary',而不是'String'。 – rintaro 2014-12-04 13:52:33

2

init()必须雨燕创建领域模型时实现。这是因为Realm使用Swift的reflect()进行自省来确定模型中的属性,这需要Realm创建模型的实例。

简单地创建一个空的init()应该可以正常工作。

还有一个问题是super.init(object:)没有提供适当的object参数。 RLMObject(object:)初始值设定项期望object参数是要设置的属性的数组或字典。在你的情况下,你通过了String

+0

如果你可以帮助一个代码示例,它会帮助 – 2015-04-15 20:15:42

+1

此GitHub问题包含解决方法:https://github.com/realm/realm-cocoa/issues/1101#issuecomment-93574402 – jpsim 2015-04-17 16:55:59

相关问题