使用 NSArray 作为函数参数

Using NSArray as function parameter

我正在尝试使用 for 中的 NSNumber 添加一个 NSArray 的所有元素。为什么此代码在 playground 示例中不起作用?

func sumaEnteros(enteros : NSArray) -> Int {
    var result = 0
    for NSNumber i in enteros{
        result += enteros.indexOfObject(i)
    }
    return result
}

Param "enteros" 在 playground 中被标记为错误。

不要使用 NSArray。 Swift 想要它的数组是有类型的,所以将它声明为 [NSNumber]。虽然这是一个错误,但您的 for 循环应该使用 for...in 构造而不是使用索引变量。

func sumaEnteros(enteros : [Int]) -> Int {
    var result = 0
    for val in enteros{
        result += val
    }
    return result
}

sumaEnteros([1, 2, 3])

或更简单:

func sumaEnteros2(enteros : [Int]) -> Int {
    return enteros.reduce(0, combine: +)
}

不要使用 NSArray

为了使您的功能正常工作,您应该将代码更改为:

func sumaEnteros(enteros : NSArray) -> Int {
    var result = 0
    for i in enteros{
        result += enteros.indexOfObject(i)
    }
    return result
}

但是,我实际上不确定它是否会实现您想要的。此函数将汇总数组中的所有索引。例如,对于包含 5 个元素的数组,它将输出 0+1+2+3+4 = 10.

根据您的问题判断,您想要的是对数组中包含的所有 NSNumber 求和。如果是这种情况,那么您应该将其更改为:

func sumaEnteros(enteros : NSArray) -> Int {
    var result = 0
    for i in enteros{
        if let number = i as? NSNumber {
            result += Int(number.intValue)
        }
    }
    return result
}

如果您真的需要 NSArray,这很有效。但是,如果您可以将其替换为 Swift 的 Array 类型,那么您可以使此功能简单得多:

func sumaEnteros(enteros : [Int]) -> Int {
    return enteros.reduce(0, combine: +)
}

最后,如果您真的想对数组中的索引求和(而不是其中包含的数字),那么您应该使用公式。索引始终为 0、1、2、3、4...n。这是一个简单的等差数列。您可以阅读计算其总和的公式 here.

使用此公式,您的函数将如下所示:

func sumaEnteros(enteros : NSArray) -> Int {
    return Int(Double(enteros.count)*Double(enteros.count-1)/2)
}