2016-06-20 2 views
1

배열의 모든 요소에 대해 특정 조건이 true 인 경우에만 실행하려는 코드가 있습니다. 현재 코드의 작동을 위해 배열의 길이를 알아야하지만 최종 목표는 배열 길이에 관계없이 작동하도록하는 것입니다.배열의 모든 요소에 대한 조건을 확인하려면 어떻게합니까?

내 현재 코드 :

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

줄이기 기능을 사용하면 해당 유형의 값과 초기 값과 동일한 유형의 값으로 배열의 요소를 매핑하는 초기 값과 폐쇄를 제공 할 수 있습니다 , 그 함수를 배열의 각 값에 적용합니다. 그래서 이것은 배열의 각 요소를 원하는 값과 비교 한 결과와 같습니다. 개념적으로 이것은 원래 작성한 것과 같습니다.

$ 0과 $ 1을 본 적이 없다면 혼란 스러울 수 있습니다. 그것들은 줄이기 위해 제공 한 익명 폐쇄에 대한 인수 일 뿐이며,이 경우 $ 0은 부울 값이고 $ 1은 배열의 요소입니다.

1

reduce 외에도 filter에 대해 알아 보려면 "다른"사례를 고려하거나 성공에 얼마나 근접하는지 측정하는 데 도움이 될 수 있습니다. 예를 들어 : first(where:)

스위프트 3에서
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

는,이 매우 간단합니다 :

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

스위프트 2.2에서는 유사 : 어느 경우

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

, 이들은 즉시 반환 첫 번째 실패 요소를 찾으면 false입니다.

관련 문제