티스토리 뷰

Swift

Swift ) TextOutputStream

Zedd0202 2020. 4. 25. 18:16
반응형

 

 

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

방금 TextOutputStream이란걸 알아서 ㅇ0ㅇ 공부해보려고 합니다아

TextOutputStream은 프로토콜이에요! Swift Standard Library안에 있는 친구입니다.

뭔가 Text / Output / Stream...스트림..?인데..Text와 관련된 친구같죠/

맞습니다. 정의는 "text-streaming operation의 target(대상)이 될 수 있는 타입" 입니다.

 

자 잘보세요.

우리에게 익숙한 print와 dump

보통 이런식으로 쓰죠?

근데 print와 dump의 다른 이니셜라이저는

이렇게 to라는 파라미터에 TextOutputStream타입을 넣을 수 있도 있답니다.

그럼 사용해봅시다!

 

String

 자 s라는 변수는 string타입입니다. 

그리고 s를 to에 넣었네요. (terminator와 separator는 아시죠..!?!? 모르시는 분들은  이 글을 참고해주세요.

일단 Swift의 String타입은

TextOutputStream을 준수하고 있기 때문에 저 to에 들어갈 수 있답니다.

 

그리고 to는 파라미터를 inout으로 받습니다.

inout은 아시죠..!? 흠 근데 저는 써본적은 별로 없네요.

inout에 대해 간단하게 설명하자면, 함수가 parameter의 값을 수정하고, 함수 호출이 끝난 후에도 변경사항을 유지하고 싶으면 parameter를 inout으로 정의하면 됩니다. &를 앞에 붙혀야하구요.

inout 은 

1. 함수가 호출되면 argument의 값이 복사.

2. 함수 본문에서 사본이 수정됨.

3. 함수가 리턴되면, 복사본의 값이 original argument에 다시 할당됨.

의 과정을 거칩니다. 

즉 그럼 이 말은 뭐다? 

s가 처음에는 ""이지만..print함수 안에서 n이 s에게 할당되고

함수가 끝나면 s는 "12345"가 되어있습니다.

아무튼 to에 String타입을 직접 넣을 수 있다!

 

그럼 String말고 우리가 정의한 Custom Type이 TextOutputStream을 준수하면 저 to안에 들어갈 수 있겠네요!

맞습니다.

그럼 해봅시다.

 

Custom TextOutputStream Type

ZeddLogger를 하나 만들고 TextOutputStream을 채택했습니다.

TextOutputStream은 required method가 있는 프로토콜이기 때문에

이걸 구현해줘야겠죠? 그게 write라는 메소드입니다.

입력을 전부 대문자로 바꿔버리겠삼

이렇게 하면?

이렇게 출력되게 됩니다.

여기서 제 궁금증.

forEach안에도 print가 있고, writer메소드안에서도 print가 있죠!?

writer안에서 print를 해주지않으면 아무것도 출력이 되지 않습니다..!!! 

print가 write를 호출하고 write가 그걸 출력하는 역할같음...ㅎ

 

아무튼...!!!! 이런친구도 있었네요.

이걸 발견하게 된...이유?는 

Combine의 print에도 똑같이 TextOutputStream을 넣을 수 있기 때문이죠!

제 TextOutputStream은 모두 대문자로 바꿔버리는 친구였잖아요?

zzz그래서인지

이런 이벤트(?) 로그 들도 전부 대문자로 나오게됨ㅋ

아무튼 오늘 공부하면서 느낀점은..

Swift Standard Library에는 의외로 섬세한?....것들이 많은 것 같아요zzz 

반응형

'Swift' 카테고리의 다른 글

Swift 5.3 released!  (3) 2020.09.17
Swift ) URLComponents  (0) 2020.08.23
Swift 5.2 Released!  (1) 2020.03.25
Standard Library Preview Package  (1) 2020.02.19
Swift ) Mirror  (1) 2020.01.19