我在各种场合遇到过这个关键字。我知道它应该做什么。但我真的想要更好地理解它。
我注意到@NSManaged
- 不是基于文档,而是基于重复使用:
@dynamic
(我不太了解)PFObject
继承Parse SDK
。它通常使用KVC从/向后端读取/写入值。@NSManaged
对任何变量进行前缀将在我不在初始化程序中初始化时关闭编译器。 正式定义(在Core Data Apple Docs中):
Core Data提供NSManagedObject类的子类中的属性的底层存储和实现。在托管对象子类中的每个属性定义之前添加@NSManaged属性,该属性对应于Core Data模型中的属性或关系。与Objective-C中的@dynamic属性一样,@ NSManaged属性通知Swift编译器将在运行时提供属性的存储和实现。但是,与@dynamic不同,@ NSManaged属性仅适用于Core Data支持。
我从中获得了什么:
@NSManaged
的变量应免于某事的编译时检查。
我已经阅读了有关此事的正式文件和其他各种SO问题:
@synthesize vs @dynamic, what are the differences?
What is common case for @dynamic usage?
我本能地认识到我应该使用它的一些场景。我部分知道它的作用。但我所追求的是对它的作用的更纯粹的理解。
进一步观察:
PFObject
中的Parse SDK
依靠Key Value Coding
来访问其值。 PFObject
提供以下访问者:
objectForKey:
let score = results.objectForKey("descriptionOfResult")
//returns the descriptionOfResult value from the results object
setObject:forKey:
results.setObject("The results for a physics exam", forKey: "descriptionOfResult")
//sets the value of descriptionOfResult
据我了解,@NSManaged
神奇地了解我声明的变量会自动使用get
和set
的上述访问者。我想知道它是如何做到的(如果我理解的是真的),以及它做的其他事情。
答案 0 :(得分:36)
是的,它实际上就像@dynamic一样 - 技术上它甚至可能是相同的。在语义上有一点点差异:
@dynamic说'编译器,不要检查我的属性是否也已实现。可能没有你能看到的代码,但我保证它会在运行时'
@NSManaged现在说'编译器,不要检查那些属性,因为我有Core Data来处理实现 - 它会在运行时出现'
所以你甚至可以说:@NSManaged是一个语法糖,它是动态的一个更窄的版本:)
https://github.com/KyoheiG3/DynamicBlurView/issues/2
这里有人甚至在没有CD的情况下使用了@NSManaged,因为他想要@dynamic行为
答案 1 :(得分:3)
在apple docs中,对于自定义托管对象类,它们引用属性示例,如...
对我来说似乎没有区别,我在目标C中使用@dynamic
,似乎@NSManaged
是Swift的替代品。
答案 2 :(得分:0)
上述答案是正确的。这是我的理解。
@NSManaged表示在运行应用程序时变量会获得一些值。 Coredata会自动为这些道具创建getter和setter。它使编译器静默警告。
NSmanaged是NSObject的子类。 @NSManaged意味着在运行时将为这些道具提供额外的代码。 它跟踪对这些属性所做的更改。