如何在swift中编写一个平均函数,在可选Ints数组的输入中?这是我到目前为止所写的内容:
func ave(array: [Int?] -> Double?) {
var mysum = 0
for num in array {
mysum += num
}
return Double(mysum)/Double(array.count)
}
我阅读了很多可选的int但我不知道如何在可选的int数组中输入时实现...任何帮助?
答案 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)
}