Arrays 如何创建可通过关系访问的可变ArrayValue?

Arrays 如何创建可通过关系访问的可变ArrayValue?,arrays,core-data,swift3,relationship,Arrays,Core Data,Swift3,Relationship,我已经在我的数据模型中的实体Person和ListItem之间添加了一个名为listItems的关系,然后使用 let personSelectedListItems = person.mutableSetValue(forKey: "listItems") personSelectedListItems.addObjects(from: selectedListItems) print("personSelectedListItems after addObjects

我已经在我的数据模型中的实体
Person
ListItem
之间添加了一个名为
listItems
的关系,然后使用

    let personSelectedListItems = person.mutableSetValue(forKey: "listItems")
    personSelectedListItems.addObjects(from: selectedListItems)
    print("personSelectedListItems after addObjects contains \(personSelectedListItems)")
其中,
selectedListItems
是类型为
ListItem
的对象数组。print语句给出:

personSelectedListItems after addObjects contains Relationship 'listItems' on managed object (0x6080000d2050) <PersonMO: 0x6080000d2050> (entity: Person; id: 0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1> ; data: {
    age = Ky;
    firstName = Uykyu;
    image = <89504e47 0d0a1a0a 0000000d 49484452 000002cc 00000333 08020000 003d00d3 35000000 01735247 4200aece 1ce90000 001c>;
    isVisited = 0;
    lastName = Kuyuy;
    listItems =     (
        "0xd000000005140000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p325>",
        "0xd000000005680000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p346>",
        "0xd0000000023c0000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p143>"
    );
    locationCity = Uyk;
    locationState = You;
    notes = "";
    phoneNumber = "";
    score = nil;
}) with objects {(
    <ListItemMO: 0x6000000b6c20> (entity: ListItem; id: 0xd000000005140000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p325> ; data: {
    category = Meta;
    isSelected = 1;
    listItem = "Similar values";
    listItemStatus = 1;
    listItemWeight = 1;
    people =     (
        "0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1>"
    );
}),
    <ListItemMO: 0x6000000af900> (entity: ListItem; id: 0xd000000000080000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p2> ; data: {
    category = Appearance;
    isSelected = 1;
    listItem = Attractive;
    listItemStatus = 3;
    listItemWeight = 1;
    people =     (
        "0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1>"
    );
}),
    <ListItemMO: 0x6000000b27e0> (entity: ListItem; id: 0xd0000000023c0000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p143> ; data: {
    category = Behavior;
    isSelected = 1;
    listItem = "Good grammar";
    listItemStatus = 1;
    listItemWeight = 1;
    people =     (
        "0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1>"
    );
})
)}
我收到以下错误消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSManagedObjects of entity 'Person' do not support -mutableArrayValueForKey: for the property 'listItems''

这是令人费解的,因为我不知道为什么支持
mutableSetValueForKey:
,但不支持数组版本。我真的希望能够通过关系访问对象,最好是通过点符号。最好的方法是什么?

许多关系的核心数据总是用集合表示。对此的部分支持是
NSManagedObject
实现
mutableSetValue(forKey:)
,这是访问关系的一种文档化方法。由于许多关系都是集合,
NSManagedObject
不支持
mutableArrayValue(forKey:)
,如错误消息所示


如果需要有序关系,请在数据模型编辑器中将其标记为有序关系,然后可以使用
sensorderedset
。它仍然不是一个数组,但它有顺序。

许多关系的核心数据总是用集合表示。对此的部分支持是
NSManagedObject
实现
mutableSetValue(forKey:)
,这是访问关系的一种文档化方法。由于许多关系都是集合,
NSManagedObject
不支持
mutableArrayValue(forKey:)
,如错误消息所示


如果需要有序关系,请在数据模型编辑器中将其标记为有序关系,然后可以使用
sensorderedset
。它仍然不是一个数组,但它有顺序。

在这方面@Wain和@TomHarrington都为我指明了正确的方向,但我的问题的答案是(经过一些搜索和修补):

首先,我需要在数据模型文件的数据模型检查器中将多对多关系标记为“有序”。第二件事是改变

let personSelectedListItems = person.mutableSetValue(forKey: "listItems")
personSelectedListItems.addObjects(from: selectedListItems)
print("personSelectedListItems after addObjects contains \(personSelectedListItems)")

因此,
mutableOrderedSetValue
将反映关系的有序性质。在那之后,我得到了一套正常的退货。万岁!但是现在我如何通过关系访问和更改这些单独的对象呢?这就引出了第三件事——我必须将集合向下转换到我的类中(称为
ListItemMO
)。要获取有序集中的第一个对象,然后通过关系更改属性,如下所示:

    if let listItemSet = personVar.listItems?.object(at: 0) as? ListItemMO {
        listItemSet.listItemStatus = 0
    }

@Wain和@TomHarrington都为我指出了正确的方向,但以下是我的问题的答案(经过一些搜索和修补):

首先,我需要在数据模型文件的数据模型检查器中将多对多关系标记为“有序”。第二件事是改变

let personSelectedListItems = person.mutableSetValue(forKey: "listItems")
personSelectedListItems.addObjects(from: selectedListItems)
print("personSelectedListItems after addObjects contains \(personSelectedListItems)")

因此,
mutableOrderedSetValue
将反映关系的有序性质。在那之后,我得到了一套正常的退货。万岁!但是现在我如何通过关系访问和更改这些单独的对象呢?这就引出了第三件事——我必须将集合向下转换到我的类中(称为
ListItemMO
)。要获取有序集中的第一个对象,然后通过关系更改属性,如下所示:

    if let listItemSet = personVar.listItems?.object(at: 0) as? ListItemMO {
        listItemSet.listItemStatus = 0
    }

您是否按照模型中的顺序设置了关系?@Wain我原来没有设置,谢谢您的提示!我选中了“ordered”框并将关系更改为
mutableOrderedSetValue
,当我执行
(person.listItems?.object(at:0))
时,它给了我正确的对象。我一直坚持的是访问该对象的属性-你知道我该怎么做吗?你是否按照模型中的顺序设置了关系?@Wain我原来没有设置,谢谢你的提示!我选中了“ordered”框并将关系更改为
mutableOrderedSetValue
,当我执行
(person.listItems?.object(at:0))
时,它给了我正确的对象。我一直坚持的是访问对象的属性-你知道我怎么做吗?非常感谢你提供的信息!如何通过关系访问mutableSetValue中的对象?我有
(person.listItems?.object(at:0))
正确地给出了我感兴趣的对象,但访问其属性时遇到了问题,这就是我上述“访问对象”注释的意思。非常感谢您提供的信息!如何通过关系访问mutableSetValue中的对象?我有
(person.listItems?.object(at:0))
正确地给出了我感兴趣的对象,但访问其属性时遇到了问题,这就是我上述“访问对象”注释的意思。