2015-06-20 3 views
-1

Я пытаюсь добавить все элементы одного NSArray, используя NSNumber in for. Почему этот код не работает на примере игровой площадки?Использование NSArray как функциональный параметр

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

Параметр «enteros» отмечен как ошибка на детской площадке.

+2

Это не работает в Playground, потому что синтаксис совершенно неправильно. Компилировать это обычный проект и работать с ошибками компилятора ... 'для NSNumber i в enteros' выглядит как слепая копия некоторого кода Objective-C. 'enteros.indexOfObject (i)' не имеет никакого смысла в этом контексте. –

ответ

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 s, которые содержатся в вашем массиве. Если это так, то вы должны изменить его на:

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. Тем не менее, если вы можете заменить его 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) 
} 
1

Не использовать NSArray. Swift хочет, чтобы его массивы были напечатаны, поэтому объявите его [NSNumber]. И хотя это ошибка, ваш цикл for должен использовать конструкцию for...in вместо использования индексной переменной.

+0

ОК, но про мой цикл for, как я могу это реализовать? Я хочу, чтобы получить элементы по индексу внутри – jgd

3
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

+0

Мне нужно использовать NSArray not Int. – jgd

Смежные вопросы