objective-c - 将基元分配给 NSManagedObject 实例 (Swift)

标签 objective-c swift core-data primitive swift2

我无法在 Storyboard中完成这项工作:

设置

// Extract an int from a (JSON) dictionary
let dict = ["eventId" : NSNumber(int:20)] as [String: AnyObject]
let eventId = dict["eventId"] as? Int

// Create managed object class
@objc(Event)
class Event : NSManagedObject {
  @NSManaged var eventId: Int16 // as generated by Xcode
}
var event = Event()

尝试将原语分配给 Core Data 对象失败

event.eventId = eventId! 
// Cannot assign a value of type 'Int' to a value of type 'Int16' 

event.eventId = Int16(eventId!)
// Execution was interrupted, reason: signal SIGABRT.

event.eventId = Int32(eventId!)
// Cannot assign a value of type 'Int32' to a value of type 'Int16' 

健全性测试

eventId == nil  // false
eventId == 0    // false
eventId!        // 20
Int32(eventId!) // 20, transforming into Int32 seems to work
Int16(eventId!) // 20, transforming into Int16 seems to work
eventId is Int  // true, but with weird warnings:
// Conditional cast from Int! to Int always succeeds
// 'is' test is always true
eventId is NSNumber // true, to my surprise! Only one warning:
// 'is' test is always true

更多详细信息

请注意,将字典对象转换为 Int16Int32 将返回 nil
另外,使用 let eventId = dict["eventId"]!.integerValue 具有相同的结果。
将 id 定义为 Int32 也没有帮助,分配失败。

在具有完整核心数据堆栈(包括模型、上下文等)的正确项目中,这种情况也是如此。

我有预感,这与指令 @NSManaged 生成访问器的方式有关,但我不知道如何在不编写大量代码的情况下修复它。

此外,当我有时从头开始使用 Core Data 创建一个新项目时,它就可以正常工作 - 但我无法辨别任何差异。如果您有任何见解,请告诉我。我通常的解决方法是不使用基元,但使用 NSNumber 有时不太简洁。

最佳答案

NSManagedObject 的实例必须使用指定的 初始化器

init(entity:insertIntoManagedObjectContext:)

否则,核心数据访问器方法将无法在运行时正确创建。 所以这应该有效:

let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: context)!
let event = Event(entity: entity, insertIntoManagedObjectContext: context)

// Alternatively, use the equivalent "convenience method" from NSEntityDescription:
let event = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context) as! Event

event.eventId = Int16(eventId!)

关于objective-c - 将基元分配给 NSManagedObject 实例 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31628609/

相关文章:

iphone,我的 AVPlayer 播放器播放视频的速度非常快

ios - MPMediaQuery 仅返回本地项目

ios - 向下滚动时如何使 UIButton 在表格 View 中保持选中状态

xcode - 如何在不使用 xcrun -sdk macosx 的情况下为 swiftc 设置默认路径

objective-c - 发送到实例的核心数据奇怪的无法识别的选择器

ios - 无法从 super 层中删除 CAShapeLayer

objective-c - 在传递给构造函数的 block 中引用 self

ios - 在 iPhone Core Data 或 SQLite 中存储长期数据的最佳方式是什么?

ios - 表格行高 ios Swift

ios - 什么是 CoreDataGeneratedAccessors?