안녕하세요. 이번엔 전수열 개발자님이 만드신 Then 라이브러리를 소개하려고 합니다.
저 같은 경우 아주 애용하는 오픈소스인데요. 간단하면서도 강력한 기능을 제공해 줍니다.

깃허브 주소: https://github.com/devxoul/Then

Then

Swift initializers를 위한 라이브러리로 클로저를 이용한 인스턴스 초기화를 좀 더 깔끔하게 사용할 수 있도록 도와줍니다.

사용 예제


일단 사용 예제부터 보여드리겠습니다.
일반적으로 UI 인스턴스를 생성하고 속성을 적용할 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let label = UILabel()

func setupLayout() {
  label.text = "label"
  label.textColor = .blue
  label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
}

// or

let label: UILabel {
  let label = UILabel()
  label.text = "label"
  label.textColor = .blue
  label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
  return label
}

이런 식으로 UI 인스턴스 생성 후 속성을 설정하거나 클로저 방식으로 인스턴스 생성과 속성을 정해줍니다.

같은 기능을 Then을 사용해 구현해 보겠습니다.

1
2
3
4
5
let label = UILabel().then {
  $0.text = "label"
  $0.textColor = .blue
  $0.font = UIFont.systemFont(ofSize: 12, weight: .regular)
}

이렇게 기존 코드보다 간결하고 가독성 있게 코드를 짤 수 있습니다.

분석


Then 라이브러리가 구현된 곳을 살펴보시면 then 말고도 with, `do` 함수도 있는데요.
우선 Then의 경우 프로토콜로 구현이 되어 있습니다.

1
2
3
4
5
6
7
8
9
public protocol Then {}

extension Then where Self: Any {
  // with Method
  // `do` Method
}
extension Then where Self: AnyObject {
  // then Method
}

then의 경우 AnyObject, with, `do`의 경우 Any에 확장 시켜서 다양한 타입에 사용이 가능합니다.

  • Any: 함수타입을 포함하여 모든 타입의 인스턴스
  • AnyObject: 모든 클래스 타입의 인스턴스
1
2
3
4
5
6
7
8
9
extension NSObject: Then {}

extension Array: Then {}
extension Dictionary: Then {}
extension Set: Then {}

extension UIEdgeInsets: Then {}
extension UIOffset: Then {}
extension UIRectEdge: Then {}

또 이럲게 여러 타입에 채택시켜 Then을 사용할 수 있게 되어 있습니다. 위와 같은 방법으로 custom 타입을 확장해 Then을 사용할 수 있는데요

1
2
3
4
5
extension CustomType: Then {}

let instance = CustomType().then {
  $0.속성 = 내용
}

이렇게도 사용이 가능합니다.

마무리


with의 경우 값 유형을 초기화하고 복사한 직후 클로저로 속성을 설정할 수 있고, do는 무언가 실행할 때 사용한다고 나와 있는데 일하면서 then만 쓰고 써본 적은 없는 거 같습니다…

그래도 then 기능만으로도 아주 간결하게 코드를 짤 수 있으므로 매우 추천해 드리는 라이브러리입니다.

pod를 이용해 설치하시거나 아니면 직접 구현해서 사용하셔도 되지 않을까 합니다.

업데이트:

댓글남기기