2014-10-05 3 views
1

Я пытаюсь выполнить итерацию по массиву, чтобы проверить, сколько раз происходят два определенных значения. Я придумал этот код:Итерация через массив, чтобы найти вхождения значения

var paymentNum = 0 
    var creditNum = 0 
    for index in images { 
     if images.objectAtIndex(index) == 0 { 
      paymentNum = paymentNum + 1 
     } else { 
      creditNum = creditNum + 1 
     } 
     } 

Это, похоже, не работает. Я просто получаю сообщение об ошибке «AnyObject» не конвертируется в «Int».

Куда я иду не так?

+0

Является ли изображение массивом объектов с несколькими свойствами? –

+0

Он содержит только 1s или 0s. – user3746428

ответ

2

Я сделать некоторые довольно большие предположения, потому что у вас нет много деталей о том, что происходит. Я предполагаю, что изображения NSArray. NSArray в Objective-C преобразуется в [AnyObject] в swift. Если у вас есть для каждого типа-петля, как этого

for value in array 
{} 

цикл будет перебирать каждое значение в массиве. Значение реального объект в массиве, а не счетчик, как в петле в for(int i = 0; i < 10; i++) стиле

Так что вы, вероятно, на самом деле ожидаете, чтобы сделать это

for item in images { 
    if item == 0 { 
     paymentNum++ 
    } else { 
     creditNum++ 
    } 
} 

Вам также может понадобиться, чтобы бросить петлю из [AnyObject] к [Int] как этот

let tmp = images as [Int] 
for item in tmp 
{...} 

или, отливать значение вытаскивают из массива, как этот

for item in images { 
    if (item as Int) == 0 { 
     paymentNum++ 
    } else { 
     creditNum++ 
    } 
} 

Но первый, вероятно, предпочтительнее

1

паста ина площадка:

import Foundation 

let images = [1, 0, 1, 1, 0, 0, 1, 0, 1, 1] 
var paymentNum = 0 
var creditNum = 0 
for item in images { 
    println(item) 
    if item == 0 { 
     paymentNum = paymentNum + 1 

    } else { 
     creditNum = creditNum + 1 
    } 
} 

println(paymentNum) //4 
println(creditNum) //6 
+0

исправлена ​​небольшая ошибка –

1

Существует более компактный способ достижения всего лишь двух строк кода. Принимает предположение, что элемент массива является кредитом, если его значение равно 1, в противном случае оно равно 0.

При этом, если вы суммируете все элементы массива, вы получаете количество кредитов - количество платежей размер массива минус количество кредитов.

Суммируя все элементы массива, самый простой способ использует reduce метод (подробнее here)

var creditNum = images.reduce(0, combine: { $0 + $1 }) 
var paymentNum = images.count - creditNum 

При использовании значения, отличном от 0, или 1, чтобы определить, кредиты и платежи, то расчет может быть изменен, чтобы проверить наличие явных значений следующим образом:

var creditNum = images.reduce(0, combine: { $0 + ($1 == 1 ? 1 : 0) }) 

Здесь он принимает предыдущий отсчет ($ 0) и добавить 1 или 0, в зависимости от того, является ли элемент массива ($ 1) равен 1 или нет.

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