我有一个数组,var hoursPlayed = String 他们在tableView中并且都是数字,我如何将该数组中的数字加在一起以获得平均播放时间?????在Swift 2中
答案 0 :(得分:2)
您可以使用reduce:
let sum= hoursPlayed.reduce(0.0,combine:{$0+Float($1)!})
基本上,您正在迭代数组并累积所有值。由于它是一个字符串数组,为简单起见,我强行打开了Float,但你必须检查是否可选。 reduce函数将闭包作为带有2个参数的参数。美元符号表示取第一个和第二个并将它们相加。
现在,您可以轻松地将数组中的元素数量划分为avergae。
如果你在objC世界,那么使用键值编码和@avg
运算符会很好
的 [UPDATE] 强>
正如Darko发布的那样,第一个版本不会编译。错误是将第一个参数转换为Float,因为reduce取一个初始值,我把它设为Float
,不需要进一步转换。
答案 1 :(得分:2)
let array = ["10.0", "30.0"]
if array.count > 0 {
let average = array.reduce(0.0, combine: {$0 + (Double($1) ?? 0.0)}) / Double(array.count)
print(average) // 20.0
}
$ 0不需要转换,因为它保证它总是Double。从初始值推断出$ 0,该值被声明为0.0:Double。
必须检查array.count以防止通过0进行除法。
答案 2 :(得分:1)
我使用flatMap
的组合将字符串转换为双打和reduce
以将其添加:
let doubles = array.flatMap { Double($0) }
let average = doubles.reduce(0.0, combine:+) / Double(doubles.count)
使用flatMap
可以保护您免受数组中无法转换为Double
的条目的影响。如果您知道它们都已转换为您可以将其简化为:
let average = array.map({ Double($0)! }) / Double(array.count)
最后一个选项是使用平均函数扩展Array,如果它看起来像你更常用的东西,并将它与flatMap和/或map结合使用:
protocol ArithmeticType {
static func zero() -> Self
func +(lhs:Self, rhs:Self) -> Self
func -(lhs:Self, rhs:Self) -> Self
func /(lhs:Self, rhs:Self) -> Self
func *(lhs:Self, rhs:Self) -> Self
init(_ number:Int)
}
extension Double : ArithmeticType {
static func zero() -> Double {
return 0.0
}
}
extension Array where Element : ArithmeticType {
func average() -> Element {
return reduce(Element.zero(), combine:+) / Element(count)
}
}
let avg = array.flatMap { Double($0) }.average()
答案 3 :(得分:1)
修改了Darko的方法,考虑String是否可以转换为Double,或者不考虑。对于空数组,它返回0.0
let array = ["10.0", "31.2", "unknown", ""]
func avg(arr: [String])->Double {
let arr = array.flatMap(Double.init)
var avg = 0.0
if arr.count > 0 {
avg = arr.reduce(0.0, combine: + ) / Double(arr.count)
}
return avg
}
let a = avg(array)
print(a) // 20.6