使用NSArray作为函数参数

时间:2015-06-20 17:07:21

标签: swift swift-playground

我正在尝试使用NSNumber添加一个NSArray的所有元素。为什么这段代码在游乐场示例中不起作用?

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

Param“enteros”在游乐场被标记为错误。

3 个答案:

答案 0 :(得分:3)

private returnType otherMethod(int modelId){}

或更简单:

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

sumaEnteros([1, 2, 3])

不要使用NSArray

答案 1 :(得分:1)

请勿使用NSArray。 Swift希望对其数组进行输入,因此请将其声明为[NSNumber]。虽然它是一个错误,但你的for循环应该使用for...in构造而不是使用索引变量。

答案 2 :(得分:0)

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

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)
}