如何在字符串数组中添加数字?迅速

时间:2016-03-29 04:24:06

标签: ios arrays swift swift2

我有一个数组,var hoursPlayed = String 他们在tableView中并且都是数字,我如何将该数组中的数字加在一起以获得平均播放时间?????在Swift 2中

4 个答案:

答案 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