Je veux que ma fonction calcule la moyenne de mon tableau de type Double. Le tableau s'appelle "votes". Pour l'instant, j'ai 10 chiffres.
Lorsque j'appelle le average function
pour obtenir la moyenne des votes sur le tableau, cela ne fonctionne pas.
Voici mon code:
var votes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
func average(nums: Double...) -> Double {
var total = 0.0
for vote in votes {
total += vote
}
let votesTotal = Double(votes.count)
var average = total/votesTotal
return average
}
average[votes]
Comment appeler la moyenne ici pour obtenir la moyenne?
Vous devriez utiliser la méthode reduction () pour additionner votre tableau comme suit:
Xcode 10 • Swift 4.2
extension Collection where Element: Numeric {
/// Returns the total sum of all elements in the array
var total: Element { return reduce(0, +) }
}
extension Collection where Element: BinaryInteger {
/// Returns the average of all elements in the array
var average: Double {
return isEmpty ? 0 : Double(total) / Double(count)
}
}
extension Collection where Element: BinaryFloatingPoint {
/// Returns the average of all elements in the array
var average: Element {
return isEmpty ? 0 : total / Element(count)
}
}
let votes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let votesTotal = votes.total // 55
let votesAverage = votes.average // "5.5"
Si vous devez utiliser des types Decimal
, la somme totale déjà couverte par la propriété d'extension de protocole Numeric
. Vous devez donc uniquement implémenter la propriété moyenne:
extension Collection where Element == Decimal {
var average: Decimal {
return isEmpty ? 0 : total / Decimal(count)
}
}
Vous avez des erreurs dans votre code:
//You have to set the array-type to Double. Because otherwise Swift thinks that you need an Int-array
var votes:[Double] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
func average(nums: [Double]) -> Double {
var total = 0.0
//use the parameter-array instead of the global variable votes
for vote in nums{
total += Double(vote)
}
let votesTotal = Double(nums.count)
var average = total/votesTotal
return average
}
var theAverage = average(votes)
Moyenne simple avec filtre si nécessaire (Swift 4.2):
let items: [Double] = [0,10,15]
func average(nums: [Double]) -> Double {
let sum = nums.reduce((total: 0, elements: 0)) { (sum, item) -> (total: Double, elements: Double) in
var result = sum
if item > 0 { // example for filter
result.total += item
result.elements += 1
}
return result
}
return sum.elements > 0 ? sum.total / sum.elements : 0
}
let theAvarage = average(nums: items)
Une petite doublure, utilisant l'ancien KVC Objective-C à l'ancienne, traduite en Swift:
let average = (votes as NSArray).value(forKeyPath: "@avg.floatValue")
Vous pouvez aussi avoir la somme:
let sum = (votes as NSArray).value(forKeyPath: "@sum.floatValue")
Pour en savoir plus sur ce joyau oublié depuis longtemps: https://developer.Apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/CollectionOperators.html