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.
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.
Swift 3/Swift 4 une ligne pour récapituler les propriétés des objets
var totalSum = scaleData.map({$0.points}).reduce(0, +)
Où points est la propriété de mon objet personnalisé scaleData que j'essaie de réduire
Swift3 a été remplacé par:
let multiples = [...]
sum = multiples.reduce(0, +)
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
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
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
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
}
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
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)
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.
@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