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找到,因此在展开时为零。很明显,我不太清楚到底发生了什么。谢谢你提供的有用信息,游乐场是“固定”的,但我担心应用程序中还有一些其他问题使事情变得复杂。我要问另一个问题,而不是继续旋转这个问题。我试着投你一票,但我想我没有足够的声誉。