2014-10-05 50 views
0

如果我嘗試將存儲的屬性添加到Swift中的NSManagedObject的子類中,但未提供默認值(我會在初始化程序中這樣做,請注意) ,我得到這個錯誤:將存儲的屬性添加到Swift中的NSManagedObject的子類中

Stored property 'foo' requires an initial value or should be @NSManaged 

的代碼如下:

class Thing : NSManagedObject{ 
    var foo : String 
    var bar : String 

    init(foo: String, bar : String){ 

     // blah, blah... 
    } 
} 

什麼是執行這一原因呢?爲什麼我不能在初始化程序中初始化?

+1

您可能會爲此使用* transient屬性*。瞬態屬性不會保存到持久存儲中,但Xcode會創建相應的Swift屬性,並且Core Data運行時會創建必要的存取器方法。 - 還要注意,你*必須*使用指定的初始化程序'init(實體實體:NSEntityDescription, insertIntoManagedObjectContext context:NSManagedObjectContext!)'創建託管對象。 – 2014-10-05 18:28:48

回答

4

編輯:下面的答案適用於各種各樣的情況,並與此相關,但並不完全解決NSManagedObject的情況。在NSManagedObject的情況下,可以從持久存儲中加載對象並進行初始化,而無需調用特定的初始化。 Swift在這些情況下不知道應該分配foobar,所以需要一些默認值(而不是像在其他子類情況下那樣只使用finalrequired)。

所以正確的問題是:當數據從數據存儲中加載該對象時,Core Data如何處理foobar


因爲編譯器不能證明所有的子類都會執行或調用init(foo,bar)。如果子類沒有實現該初始化程序,則可能不會初始化foobar

您可以通過多種方式解決問題。您可以提供默認值。您可以使值顯式展開選項(使其默認值爲nil)。您可以將這些值設爲可選。您可以聲明此初始化程序required,以便所有子類必須實現它。或者您可以聲明Thingfinal,以便它不能被分類。

+0

爲什麼只有當它是NSManagedObject的子類時纔會發生?如果我在聲明中刪除超類,它編譯得很好。 – cfischer 2014-10-05 18:14:39

相關問題