web-dev-qa-db-ja.com

関数に配列の平均を計算させるSwift

Double型の配列の平均を関数で計算したい。配列は「投票」と呼ばれます。今のところ、10個の数字があります。

average functionを呼び出して配列投票の平均を取得しても、機能しません。

ここに私のコードがあります:

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]

ここで平均を呼び出して平均を取得するにはどうすればよいですか?

24
Lukesivi

次のように、reduce()メソッドを使用して配列を合計する必要があります。

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"

Decimal型で作業する必要がある場合、合計は既にNumericプロトコル拡張プロパティでカバーされているので、averageプロパティのみを実装する必要があります。

extension Collection where Element == Decimal {
    var average: Decimal {
        return isEmpty ? 0 : total / Decimal(count)
    }
}
94
Leo Dabus

コードにいくつかの間違いがあります。

//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)
8
Christian Wörz

必要に応じてフィルターを使用した単純平均(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

Swiftで翻訳された昔ながらのObjective-C KVCを使用した小さな1つのライナー:

let average = (votes as NSArray).value(forKeyPath: "@avg.floatValue")

また、合計を持つことができます:

let sum = (votes as NSArray).value(forKeyPath: "@sum.floatValue")

この長く忘れられていたgemの詳細: https://developer.Apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/CollectionOperators.html

2
Zaphod