2016-04-25 45 views
6

我已經很長時間的Objective-C開發人員,並在幾周前聽說Realm。另一方面,我一直希望一點一點地向Swift遷移,所以我創建了一個涉及Realm + Swift的小型項目。Swift + Realm新手:問題與一個簡單的Realm對象及其初始化器

這是什麼意思?我是Swift + Realm的新手。

無論如何,我爲一個項目創建了一個小型演示/概念驗證,我認爲它必須更簡單。但Xcode編譯器說不然。

我的問題是與我的對象的初始值(s)之一。

我的意圖很簡單,但顯然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" 
    } 

} 

我原來的代碼只有「正常」的init初始化。但Xcode迫使我創建更多的額外的初始化器(值和領域)。

如果我編譯上面剛剛粘貼的代碼,Xcode會在第二個和第三個必需的初始化器中進行投訴,特別是在super.init部分。 它說:

Property 'self.id_partida' not initialized at super.init call 

我明白它的意思,但我不知道如何避免錯誤,因爲如果我刪除這兩個super.init線,在運行時程序崩潰。

如果我取消註釋fatalError行,它們也會在運行時崩潰。

事實上,我不想使用這2個初始值設定項。如果可以的話,我不會添加它們,但顯然Xcode需要。我真正想要添加到我的對象初始化函數中的唯一代碼是「簡單」初始化函數,這是我認爲是代碼的唯一部分。

我想我可能有境界+斯威夫特+初始化一些概念的誤解。

我也有感覺的Xcode迫使我添加代碼,我不需要和/或我也不明白。

上理解任何幫助「所需的初始化」的境界初始化會更受歡迎。

官方境界+斯威夫特文檔超出了我的知識,我甚至不經過重新閱讀他們多次瞭解它的許多概念。

Google和StackOverflow這次沒有真正有用...

謝謝。

+0

你只需要'便利的init'並在裏面添加'self.init()',不需要'需要的初始化' – Tj3n

+0

如果我註釋掉「需要的init」複合初始值設定項(第2和第3),XCode無論如何,7.3都會抱怨。它只是不編譯。如果我在簡單初始化程序之前刪除了「required」關鍵字,則XCode會抱怨:「您需要在所有覆蓋項上使用必需的關鍵字」。 – Isaac

+0

請檢查下面的答案,我希望它可以幫助你ü – Tj3n

回答

6

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" 
    } 

} 

讓我知道如果這仍然行不通! :)

+0

它的確如此,我的最終代碼版本變得非常糟糕,就像你輸入的那樣:)無論如何,我擔心一旦我需要額外的初始化工具,或者我的對象變得越來越複雜(他們會),我將來需要額外的幫助來處理這個意想不到的難題。謝謝 – Isaac

3

因爲它已經在Objectinit(),您使用對象的子類,所以你已經擁有了在領域對象init,你應該給你的VAR初始化值,如dynamic var id_partida: String = "id_partida_test",然後如果你調用let test = Partida()它已經擁有您2初始化值,其他的init上應標有便利

當您保存對象持久存儲,應該始終有值,就可以使用領域可選的話,需要閱讀文檔

這裏是我的樣品境界上課讓你明白:

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" 
    } 
} 
+0

我已經將你的代碼的一部分調整到我的。現在,XCode編譯器並不強制我使用「required init」複雜的初始化方法,但在方便的時候使用self.init()init()創建了一個無限的初始化方法循環(正如我在運行示例之前所預期的那樣),並且它在運行時崩潰。我沒有在init()裏面調用self.init()... – Isaac

+0

我不認爲你需要那個init :)所以應該刪除它,並給你的變量的初始值,並使用便捷的init如果你想創建支持者init – Tj3n

+0

好的,不,然後,現在它編譯。我必須現在在var聲明中分配我的原始init值(沒問題)。顯然也沒有崩潰,所以我必須檢查我的領域對象屬性是否存儲,持久等...我有我覺得我不明白爲什麼現在它的作品。不管怎麼說... – Isaac