Сделать мою функцию вычислить среднее значение массива Swift
Я хочу, чтобы моя функция вычисляла среднее значение моего массива двойного типа. Массив называется "голоса". На данный момент у меня 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]
Как я могу назвать среднее здесь, чтобы получить среднее?
2 ответов
вы должны использовать метод 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(Int(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
свойство расширения протокола, поэтому вам нужно только реализовать среднее свойство:
extension Collection where Element == Decimal {
var average: Decimal {
return isEmpty ? 0 : total / Decimal(count)
}
}
у вас есть некоторые ошибки в коде:
//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)