Swift中可选的Int到数组 - 平均函数

时间:2015-09-04 17:31:17

标签: arrays swift

如何在swift中编写一个平均函数,在可选Ints数组的输入中?这是我到目前为止所写的内容:

func ave(array: [Int?] -> Double?) {

    var mysum = 0
    for num in array {
        mysum += num
    }
    return Double(mysum)/Double(array.count)
}

我阅读了很多可选的int但我不知道如何在可选的int数组中输入时实现...任何帮助?

6 个答案:

答案 0 :(得分:5)

这是在Swift 2中,因为它现在只有几天了:

func ave(array: [Int?]) -> Double? {
    guard array.filter({ $0 == nil }).isEmpty else {
        print("One of the Ints was nil")
        return nil
    }
    return Double(array.reduce(0, { $0 + $1! })) / Double(array.count)
}

开始guard语句检查array是否有nil个成员,如果发现任何消息,则返回nil

如果找不到nil,我们使用简单的reduce语句来计算数组成员的总和,然后除以计数。

以下是结果的一些示例:

ave([1,2,3])      // 2
ave([1,2,nil])    // nil (and the message will print)
ave([])           // Double.NaN (because you're dividing by zero)

如果你想在Swift 1.2中使用它,那么实现并没有那么不同:

func ave(array: [Int?]) -> Double? {
    if array.filter({ $0 == nil }).isEmpty {
        return Double(array.reduce(0, combine: { $0 + $1! })) / Double(array.count)
    } else {
        print("One of the Ints was nil")
        return nil
    }
}

答案 1 :(得分:1)

您只需在github.io循环中进行if let检查。

for

正如您所看到的,我添加了一个名为func ave(array: [Int?])-> Double { var arraySize = array.count var mysum = 0 for num in array { if let num = num{ mysum += num }else{ arraySize-- println("Is nil") } } return Double(mysum)/Double(arraySize) } 的变量,因为您需要检查实际数组的大小。没有nils。否则,您的最终计算不能按预期工作。我也改变了你的func-header。您之前的代码中存在错误:

arraySize

返回值必须在func ave(array: [Int?] -> Double?) { ^^^^^^^^^^ 之外:

()

答案 2 :(得分:1)

在Swift中,您可以在两行中执行平均func(当然,您可以在一行中执行此操作,但随后会得到重复的代码 - array.filter { $0 != nil }):

func average(array: [Int?]) -> Double {
    let arrayWhithoutNils = array.filter { $0 != nil }
    return arrayWhithoutNils.count > 0 ? (arrayWhithoutNils.map { Double($0!) }.reduce(0, combine: +) / Double(arrayWhithoutNils.count)) : 0
}

print(average([1, 2, 3])) // 2
print(average([nil, 4, 5, nil])) // 4.5

答案 3 :(得分:1)

当你有一个包含可选元素的数组时,使用flatmap首先给你一个没有选项的数组通常很有帮助......

func ave ( nums:[Int?] ) -> Double?
{
    var answer : Double? = .None
    let realInts = nums.flatMap { $0 }

    if ( realInts.count > 0 ) {
        var accum : Int = 0
        realInts.map { accum += $0 }
        answer = Double(accum) / Double(realInts.count)
    }

    return answer
}

答案 4 :(得分:0)

这应该做的工作

func average(numbers: [Int?]) -> Double {
    let sum = numbers.reduce(0) { $0 + ($1 ?? 0) }
    let numValidElms = numbers.filter { $0 != nil }.count

    let delta = numbers.count - numValidElms
    if delta > 0 {
        println("Found \(delta) nil values")
    }

    if numValidElms > 0 {
        return Double(sum) / Double(numValidElms)
    } else {
        return 0
    }
}

实施例

average([nil]) // 0
average([1,2,3]) // 2
average([1, nil, 2]) // 1.5

希望这有帮助。

答案 5 :(得分:0)

还有一个选择:

func ave(array: [Int?])-> Double {

    var mysum = 0
    var c = 0
    for num in array {
        if let n = num {
           mysum += n
           c++
    }
    return Double(mysum)/Double(c)
}