[ swift ] Then을 사용해보자

sonny·2025년 1월 6일
1

TIL

목록 보기
94/133

iOS 개발을 할 때 UI 코드나 객체 초기화 과정을 좀 더 깔끔하게 작성하고 싶을 때가 많다.

특히 UIKit을 활용해 화면을 구성하면, UIView나 UILabel 같은 컴포넌트를 생성한 뒤 속성을 일일이 설정하는 반복적인 과정을 자주 겪게 되는데,

Swift 언어가 제공하는 프로퍼티 초기화 방식도 큰 문제는 없지만 한 곳에 모아두지 않으면 코드가 중구난방으로 흩어지기 쉬운 편이겠구나 하고 느낄 때가 있다.

이때 깔끔한 코드 작성을 돕는 경량 라이브러리로 많이 알려진 것이 바로 Then이라는 건데,

이번에 진행한 과제 해설영상을 보다가 알게되어 정리해보려 한다.

Then은 객체를 생성과 동시에 속성을 설정하도록 지원하다보니 코드 가독성이나 유지보수성을 높여준다는 장점이 있다.

SnapKit 같은 오토레이아웃 라이브러리와 함께 사용하면 기존 방법보다 훨씬 더 깔끔한 코드를 구성하기가 쉬워질 수 있다.


SPM으로 Then 설치하기

Then을 프로젝트에 추가하기 위해서는 Xcode 안에 있는 기능인 SPM을 이용하면 된다.

보통 CocoaPods나 Carthage 등 다른 패키지 매니저를 사용할 수도 있지만, 요즘에는 SPM이 Xcode에 기본적으로 통합되어 있어 설정이 간단하다.

Xcode에서 File > Add Packages... 메뉴를 선택하면, 새로운 창이 나타나고,

이곳에서 검색창에 Then의 GitHub 주소(https://github.com/devxoul/Then)를 입력하면 된다.

주소를 입력하면 Then 패키지를 인식하고 설치 가능 여부를 알려주는데 이후에는 ‘Add Package’를 눌러 프로젝트나 원하는 타깃(Target)에 추가하면 설치가 완료된다.

설치가 끝나면 프로젝트 내부에서 import Then 구문을 통해 라이브러리를 사용 가능하게 되고, 다른 서드파티 라이브러리와 마찬가지로 임포트만으로 쉽게 Then 기능을 이용할 수 있다.


Then 사용 방법

Then의 핵심은 크게 두 가지로 요약할 수 있다.

1) then이라는 메서드를 이용해서 객체 생성 직후 속성을 한 블록 안에서 선언적으로 처리하기.
2) with라는 메서드(Then 라이브러리에 따라 다르지만)나 이를 변형한 문법을 통해, 기존 객체에 변화를 주는 로직도 깔끔하게 분리함.

하지만 가장 대표적으로 자주 쓰는 것은 then이다.

UILabel()을 생성하고, 폰트나 텍스트 컬러, 정렬 방식을 지정할 때 아래처럼 작성할 수 있다.
.
.

  • 기존방식
let titleLabel: UILabel = {
    let label = UILabel()
    label.text = "Hello, Then!"
    label.font = UIFont.boldSystemFont(ofSize: 24)
    label.textColor = .black
    label.textAlignment = .center
    return label
}()
  • Then을 이용한 방식
let titleLabel = UILabel().then {
    $0.text = "Hello, Then!"
    $0.font = UIFont.boldSystemFont(ofSize: 24)
    $0.textColor = .black
    $0.textAlignment = .center
}

이런 식으로 작성하면 UILabel을 생성하자마자 필요한 프로퍼티를 클로저 내에서 일괄적으로 설정할 수 있다.

기존에는 let titleLabel = UILabel() 선언 후에 줄을 바꿔 각 속성을 할당하는 코드를 반복적으로 작성했을 텐데, Then 덕분에 뷰를 초기화하고 세팅하는 과정을 한꺼번에 표시할 수 있게 됐다.

이 방식은 UI뿐 아니라 다른 클래스나 구조체 생성에도 적용 가능한데,

UIView(), UIButton() 등 다양한 객체를 생성한 뒤 필요한 설정을 한데 모으기 때문에

“이 객체가 생성된 시점에 어떤 설정을 가지고 있는가” 를 더욱 직관적으로 파악할 수 있다고 한다.


SnapKit과 Then 활용하기

가장 많이 사용되는 예시는 SnapKit과의 조합이라고 한다.

SnapKit은 오토레이아웃을 코드로 짤 때 가독성을 높여주는 라이브러리인데,

Then을 곁들여 작성하면 코드 흐름이 한층 더 정리되는 느낌을 준다.

viewDidLoad() 안에서 UI 컴포넌트를 생성하고, 속성 설정, 오토레이아웃 제약 설정까지 한 흐름으로 이어지는 느낌이라고 보면 될 것 같다.

  • 예시
import UIKit
import SnapKit
import Then

class ViewController: UIViewController {
    
    private let titleLabel = UILabel().then {
        $0.text = "Hello, Then!"
        $0.font = UIFont.boldSystemFont(ofSize: 24)
        $0.textColor = .black
        $0.textAlignment = .center
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        view.addSubview(titleLabel)
        titleLabel.snp.makeConstraints {
            $0.center.equalToSuperview()
        }
    }
}

이 예시를 보면, titleLabelThen을 통해 생성과 동시에 텍스트, 폰트, 색상을 설정한다.

그리고 SnapKit의 snp.makeConstraints 구문을 이용해 화면 중앙에 배치해줬는데,

여기서 만약 Then 없이 작성했다면 titleLabel 변수를 만든 뒤 별도의 줄에 각 속성을 할당하고,

addSubview를 호출한뒤에 마지막에 SnapKit 코드를 작성하는 순서로 흩어졌을 것이다.

  • Then 미사용시 코드
import UIKit
import SnapKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        let titleLabel = UILabel()
        
        titleLabel.text = "Hello, Then!"
        titleLabel.font = UIFont.boldSystemFont(ofSize: 24)
        titleLabel.textColor = .black
        titleLabel.textAlignment = .center
        
        view.addSubview(titleLabel)
        
        titleLabel.snp.makeConstraints {
            $0.center.equalToSuperview()
        }
    }
}

Then과 SnapKit을 조합해 쓰면 코드량이 약간이나마 줄어들고

“이 뷰가 탄생하자마자 바로 어떤 형태와 속성을 가지는가”를 뭔가 뭉쳐서 표현하는 것 같아서 훨씬 파악하기가 쉽다.


음...

써보니까 객체의 생성과 초기 속성 지정이 한 덩어리로 정리되기 때문에 기분탓인지 훨씬 깔끔했던 것 같다.

또 어느 위치에서 해당 뷰가 생성되고 어떤 설정을 갖는지 한 블록 안에서 파악할 수 있다보니, 협업에서도 가독성 방면에서 좋을 것 같다고 생각했다.

SnapKit과 궁합이 좋다는 점도 코드만 봤을 때는 잘 못 느꼇는데 쓰면서 알게된 것 같다.

SnapKit은 오토레이아웃 코드를 간결하게 만들지만 UI 컴포넌트 속성 부분은 여전히 따로 작성해야 할 때가 많았다.

근데 Then을 사용하면 객체 생성 -> 속성 설정 -> addSubview -> 오토레이아웃까지 크게 끊김 없이 자연스럽게 연결되는 느낌이라 전반적인 코드가 일관성있게 보인다.

물론 속성이 매우 많은 객체라면 Then 블록 안에 모든 속성을 넣는 것이 오히려 복잡해보일 수 있겠지만, 다른 블로드고 보면 대체로 UI 개발 시에 적절히 나누어 작성하게 된다면 큰 문제가 없을거라는 말이 있었다.

별거 아닌 것 같았는데 iOS 개발자들이 꾸준히 애용하는 이유가 있긴 한 것 같다.

profile
iOS 좋아. swift 좋아.

2개의 댓글

comment-user-thumbnail
2025년 1월 6일

손겸님 덕분에 새로운걸 많이 알아가네요 영원히 TIL 공장 가동 부탁드립니다

답글 달기
comment-user-thumbnail
2025년 1월 6일

괄호 안 붙여도 돼서 넘나 편한것이에요

답글 달기

관련 채용 정보