在基于属性类型转换数据时获取NSNumber异常

时间:2016-10-25 17:27:11

标签: ios swift core-data swift3 xcode8

使用此处显示的模式: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方式是什么?

1 个答案:

答案 0 :(得分:2)

通过键值编码设置核心数据属性需要值 这是NSObject子类的实例,例如NSString或。{ NSNumber

直到Swift 3.0,只有某些标量类型可以桥接到NSNumber 和返回,例如IntUIntDoubleFloat,但不是固定大小 像Int16这样的类型。 (这将在未来的Swift版本中发生变化,进行比较 SE-0139 Bridge Numeric Types to NSNumber and Cocoa Structs to NSValue。)

因此在

entity.setValue(propertyValue, forKey: propertyName)

propertyValue必须是IntNSNumber。在你的情况下 "整数16"属性Int足以容纳 所有可能的值:

let propertyValue = Int(propertyValues[idx])