[Combine] Encoding and Decoding - Operator 공부 14
안녕하세요 Pingu입니다.🐧
지난 글에서는 Combine의 Controlling Timing으로 분류된 Publisher, Operator에 대해 알아봤습니다. 이름 그대로 전달받은 값을 시간에 관련해서 처리하는 역할을 했었습니다.
이번 글에서는 Encoding and Decoding으로 분류된 Publisher와 Operator에 대해 알아보도록 하겠습니다.
Encoding and Decoding
이름에서 직관적으로 느껴지듯 Upstream Publisher에서 받은 값을 encode, decode하는 역할을 할 거 같죠?
Encoding and Decoding에 분류된 Publisher는 아래와 같습니다.
- Encode
- Decode
역시나 당연한 녀석들이 있는거 같습니다 😄
그리고 이들을 활용해서 만든 Operator는 아래와 같아요.
- encode(encoder:)
- decode(type:decoder:)
encode, decode가 뭔지 간단하게 짚고 넘어가자면, encode는 어떤 정보를 컴퓨터에서 사용하는 형태(코드)로 바꾸는 것이고, decode는 반대로 컴퓨터에서 사용하는 형태(코드)로 바꿔진 값을 원래대로 되돌리는 것입니다.
그럼 하나씩 알아보도록 할게요.
Encode
이름부터 "값 받아서 인코딩할 거야"라고 하는 거 같네요.
정의를 봐도 Upstream Publisher에게 값을 받아서 주어진 encoder로 encode 하는 역할을 한다고 합니다.
간단하니 바로 Operator로 넘어가 볼게요.
encode(encoder:)
Encode Publisher를 활용해서 만든 Operator는 encode(encoder:)입니다.
정의를 보면 upstream에서 받은 값을 특정 encoder로 encode 해서 downstream으로 전달하는 역할을 한다고 되어있습니다.
당연하게도 Output 타입은 Encodable 프로토콜을 준수해야 합니다.
간단하니 바로 사용해보고 넘어갈게요.
struct Penguin: Codable {
let name: String
let age: Int
let address: String
}
let penguinPublisher = PassthroughSubject<Penguin, Never>()
penguinPublisher
.encode(encoder: JSONEncoder())
.sink(receiveCompletion: { print($0) },
receiveValue: { data in
print("인코딩 된 값: \(data)")
guard let string = String(data: data, encoding: .utf8) else { return }
print("문자열 표현: \(string)")
})
penguinPublisher.send(.init(name: "Pingu", age: 5, address: "Antarctic igloo"))
// encode(encoder:) 예제 코드
인코딩 된 값: 52 bytes
문자열 표현: {"name":"Pingu","age":5,"address":"Antarctic igloo"}
위와 같이 Upstream Publisher에서 전달받은 값을 Data 타입으로 인코딩해서 Downstream으로 전달해준 것을 볼 수 있습니다.
Decode
다음으로 알아볼 것은 Decode입니다.
Upstream Publisher에서 값을 받으면 주어진 Decoder로 변환해서 Downstream으로 전달하는 역할을 한다고 합니다.
decode(type:decoder:)
Decode Publisher를 활용해서 만든 Operator는 decode(type:decoder:)입니다.
정의를 보면 Upstream에서 받은 값을 특정한 Decoder로 디코딩하는 역할을 한다고 합니다.
간단하니 바로 사용해보고 넘어가겠습니다.
struct Penguin: Codable {
let name: String
let age: Int
let address: String
}
let dataPublisher = PassthroughSubject<Data, Never>()
dataPublisher
.decode(type: Penguin.self, decoder: JSONDecoder())
.sink(receiveCompletion: { print($0) },
receiveValue: { print("디코딩 된 값: \($0)") })
let jsonString = """
{"name":"Pingu","age":5,"address":"Antarctic igloo"}
"""
dataPublisher.send(Data(jsonString.utf8))
// decode(type:decoder:) 예제 코드
디코딩 된 값: Penguin(name: "Pingu", age: 5, address: "Antarctic igloo")
Encode 예제와는 다르게 이번에는 json String의 data를 Penguin 구조체 형식으로 잘 디코딩한 것을 볼 수 있습니다.
이렇게 Combine의 Publisher와 Operator 중에서 Encoding and Decoding으로 분류된 것들에 대해 알아봤습니다.
이번 글의 전체 코드는 여기에서 볼 수 있습니다.
감사합니다.