2016-06-20 5 views
1

У меня есть часть кода, которую я хочу запустить, только если определенные условия верны для каждого элемента массива. В настоящее время я должен знать длину массива для любого из кода для работы, но моя конечная цель - заставить его работать для массива любой длины.Как проверить условие для каждого элемента массива?

Мой текущий код:

if (rand[0] == someInt && rand[1] == someInt && . . . && rand[n] == someInt) { 

    *do some things* 

} 

Я хочу, чтобы работать, не зная длину rand.

+0

Использовать 'forEach': http://swiftdoc.org/v2.2/type/Array/#func-foreach_ –

+0

Возможный дубликат [проверить, имеют ли все элементы массива одинаковое значение в Swift] (http: //stackoverflow.com/questions/29588158/check-if-all-elements-of-an-array-have-the-same-value-in-swift) –

ответ

1

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

if rand.reduce(true, combine: {$0 && $1 == someInt}) 
{ 
    print("do some thing") 
} 

Уменьшить функция позволяет вам указать начальное значение и замыкание, которое отображает значение этого типа и элемент массива на значение одного и того же типа в качестве начального значения , то она применяет эту функцию к каждому значению в массиве. Таким образом, это просто ANDs - результат сравнения каждого элемента массива с желаемым значением. Концептуально это эквивалентно тому, что вы изначально писали.

Если вы еще не видели $ 0 и $ 1, они могут ввести в заблуждение; они являются просто аргументами анонимного закрытия, которое вы поставили для уменьшения, в этом случае $ 0 является логическим значением, а $ 1 - элементом вашего массива.

1

В дополнение к reduce, вы можете узнать о filter, что может быть полезно, если вы заботитесь о случае «else» или измеряете, насколько вы близки к успеху. Например:

let matches = rand.filter { $0 == someInt } 

if rand.count == matches.count { 
    print("there were \(matches.count) matches") 
    // do some things 
} else { 
    print("there were only \(matches.count) of \(rand.count) total possible matches") 
} 
+0

arrayName.filter {$ 0.propertyName == true} <- очень хорошо! Спасибо за вашу помощь – nurxyz

2

В Swift 3, с first(where:), это очень просто:

extension Sequence { 
    func allPass(predicate: (Iterator.Element) -> Bool) -> Bool { 
     return first(where: { !predicate($0) }) == nil 
    } 
} 

В Swift 2.2, это похоже:

extension SequenceType { 
    func allPass(predicate: (Generator.Element) -> Bool) -> Bool { 
     for element in self { 
      if !predicate(element) { return false } 
     } 
     return true 
    } 
} 

В любом случае, они немедленно вернуться false, когда они находят первый сбойный элемент.

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