2017-11-19 3 views
0

SwiftでNSNumber配列を合計する方法は? .reduceを使用するとこのエラーが発生します。 NSNumber配列を合計する他の方法?SwiftでNSNumber配列を合計する方法は?

var record = [Record]() 
var incomeFilter: [Record] = [] 

let formatter = NumberFormatter() 
formatter.numberStyle = .currencyAccounting 
formatter.currencySymbol = "¥" 
formatter.maximumFractionDigits = 2 
formatter.minimumFractionDigits = 2 

incomeFilter = record.filter { $0.recordtype!.contains("Income") && $0.createdAt! == recordItem.createdAt!} 
let incomeSumArray = incomeFilter.map{formatter.number(from: $0.amount!) ?? 0.00}.reduce(0, +) 
//Cannot invoke 'reduce' with an argument list of type '(Int, _) 
print(incomeSumArray) 

//result without .reduce 
//[9.99, 6.58, 7777.77] 
+0

[もう一度](https://stackoverflow.com/questions/47349698/is-there-any-way-to-increase-the-number-limit-of-double-type-in​​-swift/47349958# 47349958 )、なぜあなたは**最初に**「ダブル」の値を集計して**その後**数値フォーマッタを使用して 私は昨日の私の答えでエラーメッセージを説明しました – vadian

+0

私はダブルを合計することはできないと思いますまず、いくつかの文字列にセパレータ "、"があるので、最初に 'double'を合計すると、1,000を超える数値はゼロになります。セパレータは、文字列をダブル変換ルーチンに分割します。 @vadian –

答えて

3

(_、INT)型の引数リスト」で '削減' を呼び出すことはできません私はこの問題は、タイプNSNumberのオプションで?? 0を使用していると思います。 nil-coalescingでは、常に同じタイプが必要です。あなたは最初の数値(double)にNSNumberを変換する必要があります。

let incomeSum = incomeFilter 
    .map { 
     formatter.number(from: $0.amount!)?.doubleValue ?? 0 
    } 
    .reduce(0, +) 

または

let incomeSum = incomeFilter 
    .map { 
     guard 
      let amountString = $0.amount, 
      let number = formatter.number(from: amountString) 
     else { 
      return 0 
     } 

     return number.doubleValue 
    } 
    .reduce(0, +) 
0

あなたはそれを削減する前にincomeFilterがdoubleの配列(incomeFilter.map{formatter.number(from: $0.amount!) ?? 0.00})であることをマップすることができ:

let incomeSumArray = incomeFilter.map { 
     formatter.number(from: $0.amount!) ?? 0.00 
    }.map { 
     $0.doubleValue 
    }.reduce(0, +) 
関連する問題