Swift coalescing operator (?)

안녕하세요 Combine의 replaceNil operator 를 공부하는 도중 의문점이 생겨서 질문드립니다.

replaceNil operator 는 말 그대로 nil 대신 들어갈 value를 넣어주는 operator 인데 replace(with: 변수) with 안에 들어갈 값은 optional 값을 넣어주면 안된다고 합니다…

replace(with: "sample" as String?) //에러발생

그런데 이 replaceNil operator 와 ?? operator 와의 차이점은 ?? 은 optional 을 리턴할 수 있다고 합니다.

var sampleText : String? = nil
print( sampleText ?? "replaceNil" as String?)

제가 느낀 바로는 ?? operator 는 unwrapping 의 느낌이 좀 있었는데 optional 을 반환 할 수 있다고 하니 재귀적으로 optional 을 optional 로 처리하고 또 그것을 optional 로 처리하는 무한궤도의 느낌입니다.

혹시 ?? operator 를 사용할 때 Nil 을 대신하는 값으로 또 optional 값을 사용하는 예시가 있을까요??
왜 굳이 이렇게 만들었을지 궁금합니다.

좋아요 1

안녕하세요, uuzaza 님. 재미있는 이슈네요. 고민해 볼 이슈이기도 하구요.

제 생각을 풀어볼께요.

먼저 오퍼레이터들이 만들어진 순서를 생각해 봐야 하는데, Nil 결합 연산자인 ?? 는 Swift를 처음 발표할 때부터 있던 오퍼레이터이고
replaceNil은 이번에 나온 Combine을 쓰기 위한 오퍼레이터죠.

두 오퍼레이터의 목표가 다르다고 생각하는데요,
uuzaza 님의 글처럼, replaceNil은 업스트림 퍼블리셔로부터 온 값에서 nil 값을 없애기 위해 만들어진 오퍼레이터이기 때문에
가능한 nil값을 받지 않는 게 목표이구요.

?? 오퍼레이터는 앞의 값이 nil인 경우를 대비하는 로직을 작성하는 게 목표이기 때문에
말씀하신 것 처럼 옵셔널을 받을 수도 있죠.

?? 에서 뒤쪽 값에 옵셔널을 사용하는 경우라면, IBOutlet 처럼 UI 요소들의 경우 태생적인 한계로 옵셔널이기 때문에 UI관련 작업을 할 때 ?? 를 사용할 때는 뒤쪽에도 옵셔널 값을 사용하겠죠.

다른 사례는… 아래에:point_down: 다른 분이 답글 달아주실 겁니다. ㅋㅋㅋ

좋아요 1