在CoreData中,我定义了从Node
到无序的多对多关系Tag
。我创建了一个这样的Swift实体:
import CoreData
class Node : NSManagedObject {
@NSManaged var tags : Array<Tag>
}
现在,我要向Tag
的实例添加Node
,如下所示:
var node = NSEntityDescription.insertNewObjectForEntityForName("Node", inManagedObjectContext: managedObjectContext) as Node
node.tags.append(tag)
但是,此操作失败并显示以下错误:
由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“一对多关系的值的不可接受类型:property =“
tags”; 所需的类型= NSSet ; 给定类型=
_TtCSs22ContiguousArrayStorage000000000B3440D4; 值=(“
<_TtC8MotorNav3Tag:0xb3437b0>(实体:Tag; id:0xb343800; data:{…})”)。
一对多关系的正确类型是什么?
为了能够在Swift中处理一对多关系,您需要将property定义为:
class Node: NSManagedObject {
@NSManaged var tags: NSSet
}
如果您尝试使用NSMutableSet
更改,则不会保存在CoreData中。当然,建议在以下位置定义反向链接Node
:
class Tag: NSManagedObject {
@NSManaged var node: Node
}
但是Swift仍然无法在运行时生成动态访问器,因此我们需要手动定义它们。在类中定义它们extension
并放入Entity+CoreData.swift
文件中非常方便。波纹管是Node+CoreData.swift
文件的内容:
extension Node {
func addTagObject(value:Tag) {
var items = self.mutableSetValueForKey("tags");
items.addObject(value)
}
func removeTagObject(value:Tag) {
var items = self.mutableSetValueForKey("tags");
items.removeObject(value)
}
}
用法:
// somewhere before created/fetched node and tag entities
node.addTagObject(tag)
重要说明: 要使其全部正常工作,您应该验证CoreData模型中实体的类名称包括模块名称。例如MyProjectName.Node
问题内容: 我正在用Swift编写iOS游戏,但我想在结尾加上高分标签。我认为保存功能是正确的,但负载之一就是给我带来麻烦的功能。我已经创建了一个实体(“ BestScores”)和属性(“ classicBestScoreTF”): 要保存最高分: 它不起作用:(请帮忙! 问题答案: 保存数据: 加载数据中:
问题内容: 我在JPA中使用实体映射存在以下问题。我有两个实体,第一个是Lookup,第二个是Text,它表示实体的翻译。现在,我需要将Lookup绑定到Text,但是我不希望Text引用Lookup。更复杂的是,Text在此关系中不使用其主键,而是在列中定义的元代码 。 因此,我尝试了这种方法(以及其他几种方法),但没有结果。我也不能在数据库中创建联接表,也不想将Lookup绑定到Text类。所
关于JPA中的实体映射,我有以下问题。我有两个实体,第一个是查找,第二个是表示实体翻译的文本。现在我需要将Lookup绑定到文本,但我不希望文本引用Lookup。为了使这种情况更加复杂,文本在此关系中不使用其主键,而是使用列中定义的元码。 所以我尝试了这个(和其他一些变体),但没有结果。我也不能在数据库中创建连接表,我不想绑定查找到我的文本类。谁能告诉我有没有别的办法?
问题内容: 我正在使用xcode 6,并且已经导入和。我还添加了文件巫婆导入sqlite3.h 我可以打开SQLite数据库并执行简单操作,例如插入选择… 用 我有一个错误: 我做什么表演?我是Swift的新手,这是我在Stack上的第一个问题,请有人帮助我! 问题答案: 定义 from 不会导入到Swift中,可能是由于“不安全”的指针强制转换。 SQLite.swift项目的 Statemen
问题内容: 在Swift中有可能吗?如果没有,那么是否有解决方法? 问题答案: 1.使用默认实现(首选)。 优点 不涉及Objective-C运行时 (至少没有明确 涉及 )。这意味着您可以使其符合结构,枚举和非类。同样,这意味着您可以利用强大的泛型系统。 *当遇到符合此类协议的类型时, *您始终可以确保满足所有要求 。它始终是具体实现或默认实现。这就是“接口”或“合同”在其他语言中的行为方式。
问题内容: 在Objective-C中,自定义通知只是一个普通的NSString,但是在Swift 3的WWDC版本中并不明显。 问题答案: 您也可以为此使用协议 然后将您的通知名称定义为所需的任何位置。例如: 并像这样使用 这样,通知名称将与基金会分离。而且您只需要修改协议,以防更改实现。