web-dev-qa-db-fra.com

Recherche de la somme des éléments dans le tableau Swift

Quel est le moyen le plus simple (le meilleur) de trouver la somme d’un tableau d’entiers dans swift? J'ai un tableau appelé multiples et j'aimerais connaître la somme des multiples.

194
ejLev

C'est la méthode la plus simple/la plus courte que je puisse trouver.

Swift 3 et Swift 4:

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

Swift 2:

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

Quelques informations supplémentaires:

Ceci utilise la méthode de réduction de Array (documentation ici ), qui vous permet de "réduire une collection d'éléments à une valeur unique en appliquant de manière récursive la fermeture fournie". On lui donne 0 comme valeur initiale et ensuite, essentiellement, la fermeture { $0 + $1 }. Bien sûr, nous pouvons simplifier cela en un seul signe plus, car c'est ainsi que Swift roule.

413
username tbd

Swift 3/Swift 4 une ligne pour récapituler les propriétés des objets

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

points est la propriété de mon objet personnalisé scaleData que j'essaie de réduire

55
Jesus Rodriguez

Swift3 a été remplacé par:

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

Cela fonctionne aussi:

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

Le résultat sera: 55

11
Marco Almeida

In Swift 4 Vous pouvez également contraindre les éléments de la séquence à un protocole Numérique afin de renvoyer la somme de tous les éléments de la séquence comme suit:

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

éditer/mettre à jour:

Xcode 10.2 • Swift 5 ou version ultérieure

Nous pouvons simplement contraindre les éléments de séquence au nouveau protocole AdditiveArithmetic pour renvoyer la somme de tous les éléments de la collection comme suit:

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
10
Leo Dabus

exemple de 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

Si vous avez un tableau d'objets génériques et que vous voulez additionner une propriété d'objet, alors:

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 

Malgré la forme plus courte, vous préférerez souvent le cycle classique:

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

Que diriez-vous de la manière simple de

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

// où n = nombre d'éléments dans le tableau

6
Naishta

Une solution possible: définir un opérateur de préfixe pour cela. Comme l'opérateur réduit "+ /" comme dans APL (par exemple GNU APL)

Une approche un peu différente ici.

L'utilisation d'un protocole et d'un type générique nous permet d'utiliser cet opérateur sur les types de tableaux Double, Float et 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
   }
}

utiliser comme suit:

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

(mis à jour pour Swift 2.2, testé dans Xcode Version 7.3)

2
Ted van Gaalen

Swift 3.

j'ai eu le même problème, j'ai trouvé sur la documentation Apple cette solution.

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

Mais, dans mon cas, j'avais une liste d'objets, alors j'avais besoin de transformer ma valeur de ma liste:

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

cela fonctionne pour moi.

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

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

utilisé celui-ci pour les paramètres imbriqués

0
Alexey Lysenko