Core data NSManagedObject数组和reduce函数编译但在运行时失败

Core data NSManagedObject数组和reduce函数编译但在运行时失败,core-data,swift,types,functional-programming,Core Data,Swift,Types,Functional Programming,用游乐场模拟基于核心数据的应用程序出现的问题,我似乎无法理解 class Pole { var length: NSNumber! } var poles: [Pole] = [] let pole1 = Pole() pole1.length = 1 poles.append(pole1) let pole2 = Pole() pole2.length = 2 poles.append(pole2) var sum = poles.reduce(0) { $0 + $1.length

用游乐场模拟基于核心数据的应用程序出现的问题,我似乎无法理解

class Pole {
var length: NSNumber!
}  
var poles: [Pole] = []  
let pole1 = Pole()
pole1.length = 1
poles.append(pole1)
let pole2 = Pole()
pole2.length = 2
poles.append(pole2)
var sum = poles.reduce(0) { $0 + $1.length } // error Could not find member 'length'
名为length的属性(属性)与NSManagedObject类(实体)中的属性(属性)一样为NSNumber

从NSNumber更改类型!到Int!允许该行在操场中正确编译和运行

将类型保留为NSNumber!并将违规行更改如下:

var sum = poles.reduce(0) { $0 + Int($1.length) } 
还可以在操场上正确编译和运行。下一步,使用实际的NSManagedObject实体和属性将其应用到应用程序中,进行编译,但在运行时失败。失败是“解开零”


所以底线是,当属性是NSNumber并且将其强制转换为Int似乎不可接受时,我不知道如何使用reduce函数

<代码> NStuts是一个基础类,用于包装将以值类型表示的数字,因此可以在期望引用类型的任何地方使用它们。Swift将整数文本连接到
NSNumber
,但不是相反,因此原始的
reduce
闭包试图将整数文本添加到
NSNumber
,结果弄糊涂了,并给出了一条奇怪的错误消息

创建新的
Int
是处理此问题的一种方法:

var sum = poles.reduce(0) { $0 + Int($1.length) }
或者您可以使用
NSNumber
integerValue
属性,该属性将实例的值作为
Int
返回:

var sum = poles.reduce(0) { $0 + $1.length.integerValue }

{$0+Int($1.length??0)}
有效吗?如果是,长度实际上是
nil
。添加??0导致编译错误(Int不能转换为CGFloat),我认为它失败了,因为我还没有弄清楚如何将长度转换为整数,并且该属性无法作为NSNumber找到,因此在展开时为零。很明显,我不太清楚到底发生了什么。谢谢你提供的有用信息,游乐场是“固定”的,但我担心应用程序中还有一些其他问题使事情变得复杂。我要问另一个问题,而不是继续旋转这个问题。我试着投你一票,但我想我没有足够的声誉。