web-dev-qa-db-fra.com

Faire ma fonction calculer moyenne du tableau Swift

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?

22
Lukesivi

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)
    }
}
86
Leo Dabus

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)
7
Christian

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)
2
Ferenc Kiss

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

1
Zaphod