将原语分配给 NSManagedObject 实例(Swift)
Posted
技术标签:
【中文标题】将原语分配给 NSManagedObject 实例(Swift)【英文标题】:Assigning primitives to NSManagedObject instance (Swift) 【发布时间】:2015-07-25 16:25:04 【问题描述】:我无法在情节提要中完成这项工作:
设置
// 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
更多详情
请注意,将字典对象转换为Int16
或Int32
会返回nil
。
此外,使用let eventId = dict["eventId"]!.integerValue
具有相同的结果。
将 id 定义为 Int32
也无济于事,分配失败。
在具有完整 Core Data 堆栈(包括模型、上下文等)的适当项目中,这种情况也会发生。
我有一种预感,它与指令 @NSManaged
生成访问器的方式有关,但我不知道如何在不编写大量代码的情况下修复它。
另外,当我有时使用 Core Data 从头开始创建一个新项目时,它可以正常工作 - 但我无法辨别任何差异。如果您有任何见解,请告诉我。我通常的解决方法是不使用原语,但使用 NSNumber 有时不太简洁。
【问题讨论】:
【参考方案1】:NSManagedObject
的实例必须使用指定的
初始化器
init(entity:insertIntoManagedObjectContext:)
否则,Core Data 访问器方法将无法在运行时正确创建。 所以这应该有效:
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!)
【讨论】:
以上是关于将原语分配给 NSManagedObject 实例(Swift)的主要内容,如果未能解决你的问题,请参考以下文章
如何更正错误“无法将 [NSManagedObject] 类型的值分配给 [String] 类型
创建新的 NSManagedObject 并将其分配给新的 NSManagedObject *有时*会失败
从“NSEntityDescription *”分配给“NSManagedObject Subclass*”的不兼容指针类型