【问题标题】:Swift: why does inheriting from NSManagedObject ruin my properties?Swift:为什么从 NSManagedObject 继承会破坏我的属性?
【发布时间】:2016-12-26 19:23:39
【问题描述】:

我是一个完全的 Swift/IOS 新手,关于 CoreData 有一些我根本无法理解的东西。

我有一个具有一些非可选属性的类,这些属性由指定的初始化程序初始化。然后,如果我将该类设置为从 NSManagedObject 继承,那么我会突然收到错误

Stored property X requires an initial value or should be @NSManaged.

为什么 Swift 突然认为我的属性没有初始化,即使它们显然是?

另外,我读到@NSManaged“告诉编译器属性的存储和实现将由 CoreData 处理”,但这意味着什么?

任何答案将不胜感激..

【问题讨论】:

  • 您是否添加了核心数据堆栈和模型的任何其他部分?为什么要让这个类成为托管对象?

标签: ios swift core-data nsmanagedobject


【解决方案1】:

其实我昨天刚读到这个。

是的,它确实有点像 @dynamic —— 从技术上讲,它可能是 甚至相同。语义上略有不同:

@dynamic 说'编译器,不要检查我的属性是否也是 实施的。您可能看不到任何代码,但我保证 将在运行时工作'

@NSManaged 现在说'编译器,不要像我一样检查这些属性 负责实施的核心数据——它将在 运行时'

所以你甚至可以说:@NSManaged 是一种语法糖,它更 动态的窄版:)

取自question

swift 的一大推动力是让语言变得非常安全,就像在本例中一样,检查属性是否在编译时实现。如果我理解正确,CoreData 并不完全符合这些编译时检查,因此添加 @NSManaged 让编译器知道将处理变量。

来自Apple:

您使用@NSManaged 属性通知 Swift 编译器 Core Data 提供声明的存储和实现 运行时。

【讨论】:

  • 我写了一个很长的评论但删除了它 - 这些小的 Swift 奇怪的东西正在慢慢开始下沉。所以,你说的是 NSManagedObject 导致它的子类无法确定一个属性是否是真的在子类中实现了吗?这很奇怪,考虑到触发此警告的原因是......属性已实现。好的,假设我将这些属性设置为@NSManaged。我还需要做什么?考虑到他的整个事情都是无稽之谈并且这些属性实际上已经实现,我该如何“在运行时实现这些属性”? :-)
  • 我认为这与 swift 编译器如何处理可选项有关。 Swift 是一种类型安全的语言,CoreData 堆栈仍在 obj-c 中,这在技术上不是类型安全的,@NSManaged 是连接这两个世界的一种方式。这是我的理解,但希望得到比我更聪明的人的验证。
  • 我想你可能对实现有误解。仅仅因为您声明了变量并不意味着它已实现。当 swift 编译器查看一个变量时,它必须是可选的或设置的。两者之一。 NSMangedObject 子类不具备开箱即用的能力,因为它继承自非类型安全的 obj-c 基类。您使用 @NSManaged 属性通知 Swift 编译器 Core Data 在运行时提供声明的存储和实现。 @user884248 希望对您有所帮助!
  • 这是否与 Objective-C 使用单独的头文件和代码文件有关? (= 单独的接口和实现?)
  • 感谢随机。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多