2014-12-04 16 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

相關問題