2016-03-06 2 views
1

Итак, я пытаюсь перебрать массив и увеличить два счетчика на основе индекса в массиве. Массив имеет в нем логические значения, а счетчики - для указанных логических значений. Моя реализация заполнена ошибкой, поэтому я пытаюсь выяснить, является ли моя логика неправильной или моя реализация неверна. Так лишняя пара глаз поможетЗацикливание через массивы и увеличение счетчиков в Swift

var numTrue = 0 
var numFalse = 0 
var boolArray = [true, true, false, true] 

for index in boolArray.enumerate() { 
    if index == false{ 
    numFalse++ 
    } else { 
    numTrue++ 
    } 
} 

print("Count true: \(numTrue)") 
print("Count false: \(numFalse)") 
+0

Какие ошибки вы получаете? – dasdom

+0

XCode сообщает мне, что есть проблема с двоичным оператором «==». Так что это не похоже на мой оператор «if index == false» – rowenarrow

ответ

2

Код не компилируется, потому что enumerate возвращается вам SequenceType в форме (n, x).

Измените код следующим образом:

var numTrue = 0 
var numFalse = 0 
let boolArray = [true, true, false, true] 

//We are interested in value, ignoring the index 
for (_, value) in boolArray.enumerate() 
{ 
    if value == false 
    { 
     numFalse++ 
    } 
    else 
    { 
     numTrue++ 
    } 
} 

Выход:

Count true: 3 
Count false: 1 
+1

Это прекрасно работает, мне нужно посвятить дополнительное время изучающим перечислениям. Я просто достаточно научился знать, что я могу получить доступ к индексу массива. – rowenarrow

1

Попробуйте это:

var numTrue = 0 
var numFalse = 0 
let boolArray = [true, true, false, true] 

for index in boolArray { 
    if index { 
     numTrue += 1 
    } else { 
     numFalse += 1 
    } 
} 

print("Count true: \(numTrue)") 
print("Count false: \(numFalse)") 
+0

«if index» бросает флаг, но это напоминает мне, что я могу использовать + = 1 – rowenarrow

+0

. Какая версия Xcode у вас есть? Я отлично работаю здесь. Вы видели, я удалил '.enumerate()'? – dasdom

+0

7.2.1 и теперь он работает. Мне тоже нравится ваш путь, но я уже принял ответ. В вашем подходе, как numTrue == true. Кажется, я не могу понять отношения? – rowenarrow

3

Как Unheilig написал enumarate возвращается в sequenceType.

Вы также можете удалить Перечислим вызов, на мой взгляд, сделать код в вашем случае более читаемым, как это:

var numTrue = 0 
var numFalse = 0 
var boolArray = [true, true, false, true] 

for index in boolArray { 
    if index == false{ 
     numFalse++ 
    } else { 
     numTrue++ 
    } 
} 

print("Count true: \(numTrue)") 
print("Count false: \(numFalse)") 

Edit 1: Quick-Help Doc

Для следующего Если у вас возникла аналогичная проблема или возникла ошибка, вы также можете использовать документацию Quick-Help, удерживая alt и зависая над методом, чем появляется вопросительный знак, и вы можете нажать на этот метод. Откроется окно с описанием метода, а иногда и примером, как в случае с перечислением(). Смотрите скриншот ниже:

enter image description here

Edit 2: Улучшенное решение

Swift предоставляет методы по коллекциям в вашем случае массив, чтобы уменьшить объем кода. В вашем случае вы можете использовать метод filter(), который возвращает новый массив, отфильтровывая элементы из массива, на который он вызван. Единственным аргументом является закрытие (подробнее о замыканиях here), который возвращает логическое значение, и он будет выполнять это закрытие один раз для каждого элемента массива. Swift автоматически предоставляет имена сокращенных аргументов для встроенных закрытий, которые могут использоваться для ссылки на значения аргументов закрытия по именам $0, $1, $2 и т. Д. (Из документации).

Так что в вашем случае $0 стоит для каждого элемента, начиная с индексом 0.

count возвращает количество элементов в массиве вас, так что в вашем случае с помощью filter это только возвращает значение 3, правда появляется в 3 раза.trueCounter = 3

Для falseCounter вы можете легко вычесть результат trueCounter из boolArray.count, который falseCounter = 4 - 3 -> 1

var boolArray = [true, true, false, true] 

let trueCounter = boolArray.filter({$0 == true}).count 
let falseCounter = boolArray.count - trueCounter 

print("Count true: \(trueCounter)") // Count true: 3 
print("Count false: \(falseCounter)") // Count false: 1 
+0

Я думаю, что ваш подход - это тот, с которым я попытаюсь работать. Я хочу узнать больше о перечислениях, и это более простой подход к начинающему, как я. – rowenarrow

+0

@rowenarrow Великий, что я тоже мог вам помочь. Я отредактировал свой ответ, указав на документацию быстрой помощи. Я думаю, что, поскольку вы новичок, это очень поможет вам в будущих проблемах. – ronatory

+0

Я буду помнить, что буду использовать эти быстрые документы в будущем. – rowenarrow

1

Просто чтобы добавить еще немного Swifty специи, здесь другой подход.

numTrue = boolArray.filter{ $0 }.count 
numFalse = boolArray.count - numTrue 

Он имеет различные характеристики во время выполнения, хотя (то есть создает новый массив на работу фильтра) - так что я не рекомендовал бы это безоговорочно.