关于这个话题有很多问题,但我无法让它工作。
在这个 vadian 的答案中,他通过两个重复的循环获得值:
- SWIFT 3 - 核心数据关系 - 获取数据
- https://stackoverflow.com/a/43846785/8887336
它不适用于我的代码,我无法弄清楚为什么。
这是我的代码:
import Foundation
import CoreData
struct HobbiesCollection {
let typ: String
let location: String
}
class LoadData{
class func load(context: NSManagedObjectContext) {
let persons = ["Owen", "Greg"]
let futbal = HobbiesCollection(typ: "futbal", location: "stadium")
let swimming = HobbiesCollection(typ: "swimming", location: "pool")
let collection = [persons[0]: swimming, persons[1]: futbal]
for x in collection {
let person = Person(context: context)
let hobbiesCD = Hobbies(context: context)
person.name = x.key
hobbiesCD.typ = x.value.typ
hobbiesCD.location = x.value.location
person.addToToHobbies(hobbiesCD)
do {
try context.save()
} catch let error {
print(error.localizedDescription)
}
}
let fetch: NSFetchRequest<Person> = Person.fetchRequest()
var result = [Person]()
do {
result = try context.fetch(fetch)
} catch let error {
print(error.localizedDescription)
}
for y in result {
print("Persons:", y.name!)
for x in y.toHobbies! {
let location = x.location Error: "Value of type 'Any' has no member 'location'"
}
}
}
}
我收到错误:
类型为"任何"的值没有成员"位置">
我与核心数据的两个类:
extension Person {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {
return NSFetchRequest<Person>(entityName: "Person")
}
@NSManaged public var name: String?
@NSManaged public var toHobbies: NSSet?
}
// MARK: Generated accessors for toHobbies
extension Person {
@objc(addToHobbiesObject:)
@NSManaged public func addToToHobbies(_ value: Hobbies)
@objc(removeToHobbiesObject:)
@NSManaged public func removeFromToHobbies(_ value: Hobbies)
@objc(addToHobbies:)
@NSManaged public func addToToHobbies(_ values: NSSet)
@objc(removeToHobbies:)
@NSManaged public func removeFromToHobbies(_ values: NSSet)
}
extension Hobbies {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Hobbies> {
return NSFetchRequest<Hobbies>(entityName: "Hobbies")
}
@NSManaged public var typ: String?
@NSManaged public var location: String?
@NSManaged public var toPerson: Person?
}
我还有一个关于谓词的进一步问题。如果我像这样做一个谓词提取:
fetch.predicate = NSPredicate(format: "name = %@", person1(
如果我在我的示例中有多个爱好,是否可以使用位置 = 体育场获得所有爱好,例如使用第二个谓词参数,而不是使用位置 = 带有 for 循环的人 1 的体育场来查找这些爱好?
> toHobbies 属性是 NSSet of Any,因此您需要对其进行类型转换或循环中的每个 x。
对于谓词,您可以使用键路径,例如"toHobbies.location = %@">