web-dev-qa-db-ja.com

Swift配列内の要素の合計を求める

Swiftで整数の配列の合計を見つける最も簡単な(最善の)方法は何ですか?倍数という配列があり、倍数の合計を知りたいです。

183
ejLev

これは私が見つけることができる最も簡単な/最短の方法です。

Swift 3とSwift 4:

let multiples = [...]
let sum = multiples.reduce(0, +)
print("Sum of Array is : ", sum)

スイフト2:

let multiples = [...]
sum = multiples.reduce(0, combine: +)

もう少し情報:

これはArrayのreduceメソッド(documentation here )を使います。これは "与えられたクロージャを再帰的に適用することで要素のコレクションを単一の値に減らす"ことを可能にします。初期値として0を与え、そして本質的にクロージャー{ $0 + $1 }を与えます。もちろん、これを単一のプラス記号に単純化することができます。それがSwiftがロールする方法です。

394
username tbd

Swift 3/Swift 4オブジェクトのプロパティを合計するための1つの線形

var totalSum = scaleData.map({$0.points}).reduce(0, +)

ここでpointsは私のカスタムオブジェクトのプロパティscaleDataを減らそうとしています

49
Jesus Rodriguez

Swift3は次のように変更されました。

let multiples = [...]
sum = multiples.reduce(0, +)
25
developermike

これも動作します:

let arr = [1,2,3,4,5,6,7,8,9,10]
var sumedArr = arr.reduce(0, combine: {$0 + $1})
print(sumedArr)

年です。55

11
Marco Almeida

Swift 4の例

class Employee {
    var salary: Int =  0
    init (_ salary: Int){
        self.salary = salary
    }
}

let employees = [Employee(100),Employee(300),Employee(600)]
var sumSalary = employees.reduce(0, {$0 + $1.salary}) //1000
9

Swift

一般的なオブジェクトの配列があり、いくつかのオブジェクトプロパティを合計したい場合は、

class A: NSObject {
    var value = 0
    init(value: Int) {
       self.value = value
    }
}

let array = [A(value: 2), A(value: 4)]      
let sum = array.reduce(0, { $0 + $1.value })
//                           ^       ^
//                        $0=result  $1=next A object
print(sum) // 6 

短い形式にもかかわらず、何度もあなたは古典的なfor-cycleを好むかもしれません:

let array = [A(value: 2), A(value: 4)]
var sum = 0
array.forEach({ sum += $0.value}) 
// or
for element in array {
   sum += element.value
}
7
Luca Davanzo

の簡単な方法はどうですか

for (var i = 0; i < n; i++) {
 sum = sum + Int(multiples[i])!
}

// n =配列内の要素数

6
Naishta

InSwift 4シーケンス内のすべての要素の合計を返すように Numeric プロトコルを拡張することもできます。

extension Sequence where Element: Numeric {
    /// Returns the sum of all elements in the collection
    func sum() -> Element { return reduce(0, +) }
}

編集/更新:

Xcode 10.2•Swift 5以降

次のように、シーケンス要素を新しい AdditiveArithmetic プロトコルに制限して、コレクション内のすべての要素の合計を返すことができます。

extension Sequence where Element: AdditiveArithmetic {
    func sum() -> Element {
        return reduce(.zero, +)
    }
}

let numbers = [1,2,3]
numbers.sum()    // 6

let doubles = [1.5, 2.7, 3.0]
doubles.sum()    // 7.2
6
Leo Dabus

考えられる解決策:それに対する接頭演算子を定義してください。 APLのように "+ /"を減らす演算子のように(例えばGNU AP​​L)

ここでは少し異なるアプローチがあります。

汎用型のプロトコルを使用すると、Double、Float、およびInt配列型でこの演算子を使用できます。

protocol Number 
{
   func +(l: Self, r: Self) -> Self
   func -(l: Self, r: Self) -> Self
   func >(l: Self, r: Self) -> Bool
   func <(l: Self, r: Self) -> Bool
}

extension Double : Number {}
extension Float  : Number {}
extension Int    : Number {}

infix operator += {}

func += <T:Number> (inout left: T, right: T)
{
   left = left + right
}

prefix operator +/ {}

prefix func +/ <T:Number>(ar:[T]?) -> T?
{
    switch true
    {
    case ar == nil:
        return nil

    case ar!.isEmpty:
        return nil

    default:
        var result = ar![0]
        for n in 1..<ar!.count
        {
            result += ar![n]
        }
        return result
   }
}

こんな感じで使う:

let nmbrs = [ 12.4, 35.6, 456.65, 43.45 ]
let intarr = [1, 34, 23, 54, 56, -67, 0, 44]

+/nmbrs     // 548.1
+/intarr    // 145

(Swift 2.2用にアップデート、Xcodeバージョン7.3でテスト済み)

2
Ted van Gaalen

Swift 3.

私は同じ問題を抱えていた、私は文書Appleでこの解決策を見つけた。

let numbers = [1, 2, 3, 4]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers.reduce(0, addTwo)
// 'numberSum' == 10

しかし、私の場合はオブジェクトのリストがあり、それから私のリストの値を変換する必要があります。

let numberSum = self.list.map({$0.number_here}).reduce(0, { x, y in x + y })

これは私のために働きます。

2
Luan Almeida
@IBOutlet var valueSource: [MultipleIntBoundSource]!

private var allFieldsCount: Int {
    var sum = 0
    valueSource.forEach { sum += $0.count }
    return sum
}

ネストしたパラメータにこれを使用しました

0
Alexey Lysenko