시퀀스 또는 컬렉션의 숫자 (n) 이상 요소가 true를 반환하는지 테스트하고 싶습니다. 기능. 나는 n 또는 그 이상이 true 일 때, 얼마나 많은 원소가 true를 반환 할 것인지 관심이 없다. 이 코드로 올바른 결과를 얻을 수 있습니다 :컬렉션 또는 시퀀스의 n 개 이상의 요소가 모든 요소를 처리하지 않고 조건을 전달하는지 테스트하는 방법
let result = collection.filter { test($0) }.count > (n-1)
그러나 test
기능은 collection
의 각 요소에 대해 한 번 호출된다. 이 작업을 수행하는 데 더 나은 (또는 '게으른') 방법이 있습니까?
나는이 수동으로하지만, 같은 컬렉션 뭔가 반복 수행 할 수 있습니다
let result:Bool = {
var nCount = 0
for object in collection {
if test(object) {
nCount = nCount + 1
if nCount >= n {
return true
}
}
}
return false
}()
그러나 첫 번째 방법은 훨씬 더 우아한 보인다.
최악의 시나리오에서 모든 요소를 테스트해야한다는 것을 알고 있습니다. 가능한 경우 불필요한 계산을 피하고 싶습니다.
let result = sequence.contains(where: { test($0) })
하거나
let result = sequence.contains(where: test)
물 :
우수 감사합니다. 만약에 하나 이상의 것이 아니라 두 개 또는 그 이상이 발견된다면 너무 우아합니다. –
@JoshParadroid : 업데이트를 참조하십시오. –
놀랍습니다. 나는 그런 생각을하지 않았을 것이다. 내가 dropFirst (3)가 그 숫자를 평가하게 만들었다 고 생각하는 것이 옳은가? 많은 감사합니다. –