2014-12-05 28 views
3

我在確定用於減少Swift中自定義託管對象子類數組的語法時遇到了問題。我有一個被稱爲amount的屬性的管理對象子類,它是一個NSNumber。如何使用reduce函數來獲取受管理對象數組中每個項目的金額總和。這是我嘗試過的,但是我得到一個錯誤,提示「無法找到成員'金額'」。在Swift中減少託管對象數組

let reduceSum=myArray.reduce(0) {$0 + $1.amount} 

我已經看過這個example,但它並沒有幫助,因爲我得到了找不到成員的錯誤。

回答

8

在發佈之後,我嘗試了一件事情,它工作。該錯誤消息是誤導性的,讓我覺得語法錯了,但真正的問題是我需要將NSNumber轉換爲CGFloat。這裏是什麼工作:

let reduceSum=myArray.reduce(0) {$0 + CGFloat($1.amount)} 
+0

爲什麼該行並不需要'$ 0.amount'? – 2016-04-14 00:19:03

+0

如果你看看我在我的問題中引用的例子,那可以比我更好地解釋它。在該鏈接中「在reduce代碼中,第一個閉包參數($ 0)是從零開始的運行總數,第二個參數($ 1)引用people數組中的Person對象。」 – 2016-04-16 01:21:37

+0

但是,爲什麼我們需要將其轉換爲CGFloat?它有效,但爲什麼? – user1007522 2016-06-16 07:20:07

3
extension Array { 
    var sumInt:  Int  { return map { $0 as! Int  }.reduce(0) { $0 + $1 } } 
    var sumUInt: UInt { return map { $0 as! UInt }.reduce(0) { $0 + $1 } } 
    var sumUInt8: UInt8 { return map { $0 as! UInt8 }.reduce(0) { $0 + $1 } } 
    var sumUInt16: UInt16 { return map { $0 as! UInt16 }.reduce(0) { $0 + $1 } } 
    var sumUInt32: UInt32 { return map { $0 as! UInt32 }.reduce(0) { $0 + $1 } } 
    var sumUInt64: UInt64 { return map { $0 as! UInt64 }.reduce(0) { $0 + $1 } } 
    var sumDouble: Double { return map { $0 as! Double }.reduce(0) { $0 + $1 } } 
    var sumFloat: Float { return map { $0 as! Float }.reduce(0) { $0 + $1 } } 
    var sumCGFloat: CGFloat { return map { $0 as! CGFloat }.reduce(0) { $0 + $1 } } 
    var sum: T { 
     if !isEmpty { 
      if first is Int { return sumInt  as! T } 
      if first is UInt { return sumUInt as! T } 
      if first is UInt8 { return sumUInt8 as! T } 
      if first is UInt16 { return sumUInt16 as! T } 
      if first is UInt32 { return sumUInt32 as! T } 
      if first is UInt64 { return sumUInt64 as! T } 
      if first is Double { return sumDouble as! T } 
      if first is Float { return sumFloat as! T } 
      if first is CGFloat{ return sumCGFloat as! T } 
     } 
     return 0 as! T 
    } 
} 

用法:

let inputArrayInt:[Int]=[1,2,3] 
let sumInt = inputArrayInt.sum    // 6 

let inputArrayUInt:[UInt]=[1,2,3] 
let sumUInt = inputArrayUInt.sum   // 6 

let inputArrayUInt8:[UInt8]=[1,2,3] 
let sumUInt8 = inputArrayUInt8.sum   // 6 

let inputArrayUInt16:[UInt16]=[1,2,3] 
let sumUInt16 = inputArrayUInt16.sum  // 6 

let inputArrayUInt32:[UInt32]=[1,2,3] 
let sumUInt32 = inputArrayUInt32.sum  // 6 

let inputArrayUInt64:[UInt64]=[1,2,3] 
let sumUInt64 = inputArrayUInt64.sum  // 6 

let inputArrayDouble:[Double]=[1.0,2.0,3.0] 
let sumDouble = inputArrayDouble.sum  // 6.0 

let inputArrayFloat:[Float]=[1.0,2.0,3.0] 
let sumFloat = inputArrayFloat.sum   // 6.0 

let inputArrayCGFloat:[CGFloat]=[1.0,2.0,3.0] 
let sumCGFloat = inputArrayCGFloat.sum  // 6.0 

let inputArray = [1.3,2,3] 
let sum = inputArray.sum // 6.3