[英]Xcode-beta 8. Can't create core data
我一直在嘗試添加核心數據。 每次我得到同樣的錯誤:
error: filename "EntityName +CoreDataClass.swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.swift'
我使用以下步驟添加核心數據:
1.新文件/ DataModel; 將其保存在我項目的根目錄中
選擇Model.xcdatamodeld並添加實體,添加幾個屬性,保存,編輯/創建NSManagedObjectClass子類。
因此,我在導航器中觀察到4個新文件:Model.xcdatamodeld,EntityName + CoreDataProperties.swift,EntityName + CoreDataClass.swift, _COREDATA_DATAMODELNAME_ + CoreDataModel.swift
他們的內容: _COREDATA_DATAMODELNAME_ + CoreDataModel.swift:
import Foundation
import CoreData
___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
EntityName + CoreDataClass.swift:
import Foundation
import CoreData
class EntityName: NSManagedObject {
}
實體名稱+ CoreDataProperties.swift:
import Foundation
import CoreData
extension EntityName {
@nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > {
return NSFetchRequest< EntityName >(entityName: "EntityName");
}
@NSManaged var str: String?
}
我嘗試過的:
1.清理構建,刪除DerivedData,刪除var /文件夾的內容,重新啟動
2.刪除導航器中顯示的生成文件
我所有的努力都沒有運氣。
我做錯了什么?
XCode 8中有兩個錯誤:
1 - 如果更改Codegen下拉列表,則其新值不會保存在Model.xcdatamodel中。 您必須更改其他內容才能保存。 例如,更改類名; 建立; 改回班級名稱; 再建一次。
2 - 生成的代碼放在Intermediates文件夾中的DerivedData中,但只有在文件夾不存在時才會發生。 解決方法是執行清理然后構建。
當模型文件使用Xcode 8文件格式時,Xcode 8包括自動NSManagedObject
類生成。 如果您創建自己的子類文件,則表示您正在創建重復項。 DerivedSources
中的錯誤消息中的第二個文件是Xcode自動創建的文件。
如果自動生成的文件能夠滿足您的需求,那就停止創建自己的文件,您就可以了。
如果您想要創建自己的子類,您也可以
我實際上遇到了同樣的問題(使用Swift),並懷疑它是一個bug。 如果我正確理解OP正在使用Xcode的autogen NSManagedObject子類,那么隨后就不會創建額外的(多余的)子類,這似乎是一些混亂的根源。
重現步驟:
創建一個新項目,單一視圖應用程序。 勾選“使用核心數據”
在模型實體中創建實體,添加屬性,確保保存文件(如果未明確保存,有時Xcode 8 Beta會拋出數據)
Xcode創建3個文件:
COREDATA_DATAMODELNAME_ + CoreDataModel.swift。 此文件已損壞,並且包含導入Foundation和CoreData的語句后面的無效條目 - 除非刪除此文件,否則項目將無法編譯
import Foundation import CoreData ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
實體名稱+ CoreDataClass.swift
實體名稱+ CoreDataProperties.swift
雖然編輯器此時沒有標記任何錯誤,但由於OP列出的原因(即缺少具有相同名稱但在DerivedData文件夾中帶有'。'前綴的文件),嘗試編譯失敗
如果在創建模型后手動創建NSManagedObject子類而不使用Xcode明顯錯誤的auto-gen,則沒有問題。 打字更多但更可靠! 但是,您需要從“干凈”項目開始(即在嘗試自動生成子類之前),否則錯誤仍然存在。 清理派生數據無濟於事。
*****更新*****似乎確實有一些奇怪的事情,似乎確實存在最初建議的靜默代碼生成(道歉),但這與人們的期望非常不同。 此外,這個代碼在編輯器中不可見(這似乎有點無意義和混亂)。 它是在DerivedData> Build> Intermediates> .Build的子文件夾中創建的。
我完全可以理解為什么OP被混淆了(就像我一樣!)對於它的價值而言,這個'功能'無疑是一種有用的嘗試,但如果你已經習慣了以前的行為並且你有一個生成選項,那就有點令人困惑主菜單中的可見和可編輯副本。
因此,在Codegen窗口中選擇“Manual / None”(如下所示),然后您可以使用菜單欄中的auto-gen選項(刪除'junk'后)或編寫自己的代碼。
跟着這些步驟,
通過將實體的“Codegen”設置設置為“Manual / None”,可以單獨禁用每個實體的自動生成。
將實體名稱更改為其他名稱以使其保存。 例如,更改類名; 建立; 改回班級名稱; 再建一次。
我收到此錯誤,
只需將工具版本更改為文件.xcdatamodeld中的Xcode 7.3即可
它工作正常!
對於每個人都無法讓autogen工作:
我必須在實體的用戶信息設置上將“com.apple.syncservices.Syncable”設置為“NO”。
也許這會有所幫助。
Tom Harrington答案是對的。 但是,有一種方法可以添加您自己的函數和/或變量,而無需執行上述兩個選項中的任何一個。
只需創建一個類的擴展 。 (確保將swift文件命名為與標准自動生成的NSManagesObject文件不同的名稱。)
例如。 如果你有一個名為MyEntity
的實體,你可以添加一個名為MyEntityExtension.swift
的swift文件,它看起來像這樣:
import Foundation
import CoreData
import UIKit
extension MyEntity {
var color: UIColor {
get {
return self.colorValue as! UIColor
}
set {
if newValue.isMember(of: UIColor.self) {
self.colorValue = newValue
}
}
}
}
在嘗試了一些已發布的答案后,重新啟動我的機器為我工作。
按下“構建階段”部分“編譯源”選項卡中的刪除編譯文件核心數據 -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.