2014-12-02 17 views
0

使用操場來模擬基於核心數據的應用程序的問題已成爲一個我似乎無法理解的問題。NSManagedObjects數組並減少函數編譯但在運行時失敗

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' 

命名長度的屬性(屬性)是NSNumber,因爲它在NSManagedObject類(實體)中。

從NSNumber更改類型!到詮釋!允許該線在操場上正確編譯和運行。

離開類型爲NSNumber!並更改違規線如下:

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

也編譯和正確運行在操場上。下一步,使用實際的NSManagedObject實體和屬性編譯,將其傳遞給應用程序,但在運行時失敗。失敗是「解開零」。

因此,底線我無法弄清楚如何使用reduce函數,當屬性是一個NSNumber並將其轉換爲一個Int似乎不可接受。

+0

'{ $ 0 + Int($ 1.length ?? 0)}'有效嗎?如果是,則長度實際上是「零」。 – rintaro 2014-12-02 04:35:14

+0

加入?? 0導致編譯錯誤(Int不能轉換爲CGFloat) – jrubl9427 2014-12-02 05:05:36

+0

我認爲它失敗了,因爲我還沒有想出如何將長度轉換爲整數,並且該屬性不能作爲NSNumber找到,因此在解包時爲零。我明顯不清楚發生了什麼。 – jrubl9427 2014-12-02 05:10:15

回答

0

NSNumber是一個基礎類,用於包裝否則將在值類型中表示的數字,因此可以在需要引用類型的任何位置使用它們。 Swift將整數文字連接到NSNumber,但不是相反,因此最初的reduce閉包嘗試將整數文字添加到NSNumber,變得困惑,並給您一個奇怪的錯誤消息。

創建一個新的Int是處理問題的一種方法:

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

或者你可以使用NSNumberintegerValue屬性,它返回該實例的值作爲Int

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

感謝您提供有用的信息,遊樂場是「固定的」,但恐怕我在應用程序中遇到其他問題,使事情變得複雜。我要問另一個問題,而不是繼續這個問題。我試圖給你一個投票,但我想我沒有足夠的聲望。 – jrubl9427 2014-12-02 13:03:49