【发布时间】:2018-01-15 02:47:25
【问题描述】:
我正在尝试使用带有 swift 和 CoreData 的自定义类作为可转换对象。我一直在浪费时间试图弄清楚但不能。我不断收到两个错误:无法将属性标记为 @NSManaged,因为它的类型无法在 Objective-C 中表示,并且无法将属性声明为 public,因为它的类型使用内部类型。
非常感谢您的帮助。谢谢。
我有一个名为 User 的 CoreData 对象。我还有一个名为 Site 的对象。
我不希望 Site 对象成为 CoreData 对象,因为大多数时候我创建 Site 对象时我不希望它添加到 CoreData 上下文中。
您将在下面看到“Site”类型的“primarySite”和“Site”类型的数组“sites”。这两行给出了我上面列出的两个相同的错误。
用户+CoreDataClass
import Foundation
import CoreData
public class User: NSManagedObject {
}
用户+CoreDataProperties
import Foundation
import CoreData
extension User {
@nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
return NSFetchRequest<User>(entityName: "User");
}
@NSManaged public var firstName: String?
@NSManaged public var lastName: String?
@NSManaged public var role: String?
@NSManaged public var primarySite: Site
@NSManaged public var sites: [Site]
}
网站
import UIKit
class Site: NSCoding {
let identifier: Int32
let name: String
let note: String
init(with values: Dictionary<String,Any>) {
identifier = Int32(values["identifier"] as! String)!
name = values["name"] as! String
note = values["note"] as! String
}
required convenience init(coder decoder: NSCoder) {
var siteValues = [String:Any]()
siteValues["identifier"] = decoder.decodeObject(forKey: "identifier") as! String
siteValues["name"] = decoder.decodeObject(forKey: "name") as! String
siteValues["note"] = decoder.decodeObject(forKey: "note") as!
self.init(with: siteValues)
}
func encode(with coder: NSCoder) {
coder.encode(String(self.identifier), forKey: "identifier")
coder.encode(self.name, forKey: "name")
coder.encode(self.note, forKey: "note")
}
}
【问题讨论】:
-
除非您的站点实际上比您的代码 sn-p 所暗示的更复杂,否则我会将其添加为新实体,并将 primarySite 和站点定义为从用户到站点的关系,而不是可转换的属性。
-
您表明
User正在使用手动/无代码生成,并且您在User上有一个扩展。User类在哪里定义? -
用户有两个由 Xcode 生成的文件。 User+CoreDataClass.swift 除了类声明之外没有包含任何其他内容,所以我没有考虑包含它。
标签: ios swift core-data nsmanagedobject transformable