使用此处显示的模式:identify coreData Attribute's type
// setting up entity and attributes list
let entity: NSManagedObject = NSEntityDescription.insertNewObject(forEntityName: entityName, into: backgroundContext)
let entityAttributes = entity.entity.attributesByName
...
// looping through provided property names and values
let propertyType: NSAttributeType = entityAttributes[propertyName]!.attributeType
switch propertyType {
// StringAttributeType, used in link example, isn't available in Swift 3, Xcode 8.0
//case StringAttributeType:
// using instead: NSAttributeType constants
case .stringAttributeType:
let propertyValue: String = propertyValues[idx]
entity.setValue(propertyValue, forKey: propertyName)
case .integer16AttributeType:
let propertyValue = Int16(propertyValues[idx])
entity.setValue(propertyValue, forKey: propertyName)
...
但是,使用Int16值获取异常:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'属性的值不可接受的类型:property =“this_prop_name”;所需类型= NSNumber;给定type = _SwiftValue;值= 3。'
我认为我们不再需要使用Swift在CoreData中进行NSNumber转换。或者,我是否有低脑氧气时刻?
通过实体的属性类型转换Int16(或任何其他数字值)的正确Swift 3方式是什么?
答案 0 :(得分:2)
通过键值编码设置核心数据属性需要值
这是NSObject
子类的实例,例如NSString
或。{
NSNumber
。
直到Swift 3.0,只有某些标量类型可以桥接到NSNumber
和返回,例如Int
,UInt
,Double
,Float
,但不是固定大小
像Int16
这样的类型。 (这将在未来的Swift版本中发生变化,进行比较
SE-0139 Bridge Numeric Types to NSNumber and Cocoa Structs to NSValue。)
因此在
entity.setValue(propertyValue, forKey: propertyName)
propertyValue
必须是Int
或NSNumber
。在你的情况下
"整数16"属性Int
足以容纳
所有可能的值:
let propertyValue = Int(propertyValues[idx])