티스토리 뷰

반응형

 

안녕하세요 :) Zedd입니다.

요새 시간이 없어서 개인공부를...소홀히..하고 있습니다.

피아노 연습도 거의 못하고 있고............ㅠㅠㅠㅠㅠㅠㅠㅠ 

담주부터 진짜 다시 홧팅합시다.

 

다섯번째 Combine Operator정리입니다.

 

drop(untilOutputFrom:)

dropFirst(_ :)

drop(while: )

tryDrop(while: )

append(_ :)

prepend(_ :)

prefix(_ :)

prefix(while:)

tryPrefix(while:)

prefix(untilOutputFrom:)

 

시작할게요!

 

drop(untilOutputFrom:)

drop은 두번째 Publisher로 부터 요소를 받을 때 까지 업스트림 publisher(첫번째 publisher)의 요소를 무시하는 친구입니다.

untilOutputFrom파라미터에는 Publisher가 들어갑니다. 위에서 말하는 "두번째 Publisher"가 들어가면 되겠네요. 

무슨소리인지 예제로 봅시다.


"두번째 Publisher로 부터 요소를 받을 때 까지 업스트림 publisher(첫번째 publisher)의 요소를 무시한다"

예제를 보니 바로 이해가ㅡ 가죠!?

두번째 Publisher가 요소를 보내고 난 다음부터 첫번째 Publisher의 요소를 받을 수 있게됐죠.

drop(untilOutputFrom:)은 두번째 Publisher가 요소를 생성할 때 까지

첫번째 Publisher의 모든 요소를 무시(삭제(drop))합니다. 

 

dropFirst(_ :)

dropFirst에는 count라는 파라미터가 있는데요,  이 파라미터로 들어간 개수만큼 생략하는 친구입니다. 

ㅇㅇ 5만큼 생략..drop한 걸 볼 수 있죠.

 

drop(while: )

while이 있는 걸 보니..조건문이 true일 때 까지 drop하나?

맞습니다. while로 들어간 closure가 false를 리턴할 때 까지 요소를 생략하는 친구입니다.

조건문이 0보다 작거나 같은게 들어갔네요. 

처음 -62는 0보다 작으니 while 조건은 true를 리턴합니다. 즉 false가 아니니 while문은 종료되지 않습니다. 

다음요소인 -1, 그 다음 요소인 0도 0보다 작거나 같으니 true를 리턴합니다.

그다음..!! 10을 만납니다. 0보다 큰 숫자죠! closure가 false를 리턴하니 이제 drop이 끝나게 됩니다.

drop(while:) 은 "while로 들어간 closure가 false를 리턴할 때 까지 요소를 생략하는 친구"니까요.

 

tryDrop(while: )

try 친구.......난 try가 싫어..drop(while:)가 동작은 완전히 똑같고 try가 들어갔으니 closure에서 에러가 발생하면 오류와 함께 스트림이 실패하게 됩니다.

tryDrop부분을 잘 봅시다.

0이 아닌 것만 밑으로 내보냅니다. 만약 0이면 RangeError를 내구요.

numbers가 [1, 2, 3, 4, 5, 6, -1, 7, 8, 9, 10] 이고 range가 1부터 100입니다. 

1부터 6까지는 range.contain($0)이 true이므로 tryDrop은 이 요소들을 무시하게 됩니다. 

-1이 들어오는 순간 range.contain($0)이 false가 되어 while문을(?) 벗어나게 됩니다.

그래서 "-1 7 8 9 10 completion: finished"라는 결과가 나오게 되죠.

현재 numbers는  [1, 2, 3, 4, 5, 6, -1, 7, 8, 9, 10]입니다. 0이 없죠??!?!

0을 들어가게 하면 위 guard 문에서 걸리기 때문에 RangeError가 나게 되고, 에러로 인해 스트림이 실패로 끝납니다.

 

append(_ :)

append는 생각하는 그 append랑 똑같습니다. Publisher의 output에 특정 요소를 추가하는 친구입니다.

ㅇㅇ

이렇게 요소 하나하나(?)를 추가할 수도 있지만, 

이렇게도 추가가 가능하니 참고하세요!

이것도 맘에 안든다..!? 난 Publisher로 바로 추가하고 싶음..

이렇게도 할 수 있습니다.

 

prepend( _ :)

append의 반대죠. 앞에 붙히는거임 

ㅇㅇ..

prepend도 append와 똑같이..

Sequence를 넣을 수도 있고, Publisher를 넣을 수도 있습니다.

 

prefix(_ :)

파라미터로 maxLength를 받는데요, 그 개수만큼 다시 republish하는 친구입니다.

ㅇㅇ

 

prefix(while:)

r이제 보면 감이 오죠..while로 받은 closure가 false가 될 때 까지 republish하는구나...

자ㅓ 근데..prefix는 접두사..!?잖아요. 그러니까 만약 while 조건문이

뭐 이런식이다..이러면 아예 요소가 나오질 않습니다.

정확히는..republish하지 않는거죠. 처음부터 false를 만나니까요!

 

tryPrefix(while:)

ㅇㅋ..에러를 던질 수 있겠구나..

1. numbers를 reversed했으니..10 9 8...0 이런순이 되겠죠.

2. max값을 구합니다. numbers에서 가장 큰값은 10이겠네요.

3. tryPrefix를 합니다. closure가 false를 리턴할 때 까지 republish하겠죠. 

10부터 1까지는 0이 아니므로 guard문에 걸리지 않습니다. 그리고 모두 10보다 작거나 같구요.

4. 하지만 마지막 값인 0이 걸리는 순간 guard문에 걸리게 됩니다.

그리고 OutOfRangeError를 내게됩니다. 그리고 스트림이 에러로 인해 실패하게 됩니다.

 

prefix(untilOutputFrom:)

처음에 한 drop(untilOutputFrom:)과 유사한거겠네요..!?

untilOutputFrom는 Publisher 타입입니다. 

다른 Publisher가 요소를 내보낼 때 까지 요소를 republish합니다.

이건 왜 애플 예제가 없을까요..!? drop(untilOutputFrom:)의 예제를 사용해볼게요.

ㅇㅇ "다른 Publisher가 요소를 내보낼 때 까지 요소를 republish합니다."

drop(untilOutputFrom:)은 다른 Publisher가 요소를 내보낼 때 까지 무시했다면 prefix는 그 반대입니다.

다른 Publisher가 요소를 내보내면 그제야 무시하는? republish안하는 거죠. 

다른 Publisher가 요소를 내보내지 않는다면 첫번째 Publisher는 계~~속 요소를 republish하겠죠..!?

 

Applying Sequence Operations to Elements 섹션 끝!

반응형